【问题标题】:Disable Main Window WPF禁用主窗口 WPF
【发布时间】:2015-05-14 07:01:02
【问题描述】:

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

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

谢谢

【问题讨论】:

  • 弹出窗口吗?你能显示相关代码吗?如果它是一个窗口,你不能打电话给ShowDialog吗?
  • "它以模态弹出窗口的形式显示另一个窗口" 当其他模态窗口显示时,如何访问主窗口?
  • 我正在使用 ShowDialog 但它没有相应地工作。 if (!Licensed.ValidateLicenseKey(ScanAreas.LicenseKey) && scanStatus == "complete") { ModalPopup popup = new ModalPopup(); popup.Activate(); popup.Topmost = true; popup.ShowDialog(); } 这是代码

标签: c# wpf multithreading


【解决方案1】:

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

创建“NavigationService.cs”类并将以下代码放入该类中。

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);

在你关闭子窗口之前,它不会让你点击父窗口。

【讨论】:

    【解决方案2】:

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

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

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


    更新>>>

    一个非常简单的替代方法是添加一个将覆盖页面上所有其他元素的元素:

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

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

    【讨论】:

    • 实际上它不是模态弹出窗口,而是另一个 wpf 窗口。我只是将窗口命名为 ModalWindow。如果我打开另一个窗口并将其显示为 ShowDialog,这件事就可以正常工作。但是当它在扫描完成后打开时就会出现问题,因为扫描方法是在主 UI 线程之外的另一个线程下编写的。
    • 根据您的描述user can not click on the main window untill he close the popup 它是模态对话框。 ShowDialog 正是这样做的。
    • 是的,这个东西工作正常,但只有当我们在线程部分之外打开那个窗口时。当在那个时间点在其他线程中使用相同的窗口时,主窗口被启用并且 showdialog 无法正常工作。
    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2012-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-23
      • 2015-08-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多