禁用主窗口WPF

时间:2015-05-14 07:01:03

标签: c# wpf multithreading

我正在使用WPF应用程序,我在主窗口中运行扫描功能。扫描部分在一个单独的线程中运行。扫描终止后,它会将另一个窗口显示为模式弹出窗口。

现在,我想要的是在扫描完成后弹出窗口时禁用主窗口。因此,在关闭弹出窗口之前,用户无法单击主窗口。但我无法做到这一点。

由于

3 个答案:

答案 0 :(得分:2)

将父窗口设置为子窗口(Popup)的所有者,并将子窗口打开为Showdialog(),如下所示:

创建" NavigationService.cs" class并将下面的代码放在这个类中。

public void ShowPopUpWindow(PopUpWindowViewModel popUpWindowViewModel)
       {
           PopUpWindowView= new PopUpWindowView();
           PopUpWindowView.DataContext = popUpWindowViewModel;
           PopUpWindowView.Owner = ParentWindowView;
           PopUpWindowView.ShowDialog();
       }

现在,请在ViewModel类中调用上述方法,如下所示:

PopUpWindowViewModel popUpWindowViewModel = new PopUpWindowViewModel ();
PopUpWindowViewModel.Name = "This is Popup Window";
NavigationService navigationService = new NavigationService();
navigationService.ShowPopUpWindow(PopUpWindowViewModel);

在关闭子窗口之前,不允许您单击父窗口。

答案 1 :(得分:0)

我相信阅读MSDN上的Dialog Boxes Overview页面可以消除您的困惑。从链接页面:

  

当函数需要来自用户的其他数据才能继续时,函数会显示模式对话框。由于该函数依赖于模式对话框来收集数据,因此模式对话框还可以防止用户在应用程序保持打开状态时激活其他窗口。在大多数情况下,模式对话框允许用户通过按“确定”或“取消”按钮在完成模态对话框时发出信号。按下OK按钮表示用户已输入数据并希望该功能继续处理该数据。按“取消”按钮表示用户想要完全停止执行该功能。模式对话框的最常见示例显示为打开,保存和打印数据。

请阅读链接页面上的创建模态自定义对话框部分,了解如何创建自己的自定义模式对话框Window

更新>>>

一个非常简单的选择是添加一个覆盖页面上所有其他元素的元素:

<Grid>
    <!-- Your content here -->  
    <Rectangle HorizontalAlignment="Stretch" VerticalAlignment="Stretch" 
         Fill="#3FFFFFFF" Visibility="{Binding IsOverlayVisible, 
         Converter={StaticResource BooleanToVisibilityConverter}}"/>
</Grid>

当然,您需要使用boolIsOverlayVisible属性(IValueConverter)进行数据绑定,以控制何时显示。

答案 2 :(得分:0)

尝试使用当前Dispatcher对象来调用ShowDialog

在您正在其他线程中执行的代码中使用以下块。

Application.Current.Dispatcher.Invoke(new Action(() =>
{
    //Show your dialog here.

}));