在wpf中仅禁用所有者窗口

时间:2019-01-04 04:16:13

标签: c# wpf

我有一个其中有一个窗口(例如W1)的应用程序,我希望它在打开时不阻止应用程序的处理。我已经使用W1.show()实现了这一目标。从该窗口打开另一个窗口(W2)。

我希望它的行为类似于模式,以便它禁用父窗口W1,但不得禁用其余应用程序。

简而言之: 当W2打开时

  • 应用程序继续运行

  • 只有W1被禁用

我尝试过

        W1.IsEnabled = false;
        W2.Show();
        W1.IsEnabled = true;

它在打开时将焦点移至W2,其余应用程序也继续运行,但我仍然可以使用W1,这是不正确的

如果我使用

W2.ShowDialog()

然后整个应用程序被阻止。有什么方法可以禁用仅父窗口(/所有者)吗?

2 个答案:

答案 0 :(得分:1)

这应该回答您的问题:

private void Button_Click(object sender, RoutedEventArgs e)
{
    W2.Owner = W1;
    W1.IsHitTestVisible = false;
    W2.Closing += W2_Closing;
    W2.Show();
}

private void W2_Closing(object sender, CancelEventArgs e)
{
    W1.IsHitTestVisible = true;
}

答案 1 :(得分:0)

考虑3个窗口w1w2w3。最初显示W1W2。从W1调用W3.ShowDialog(),这将禁用w1w2,因为它们都在同一UI线程上运行。我相信您的要求是仅禁用一个w1w2中的。 (在这种情况下,您要启用w2并禁用w1

为此,您需要从具有STA行为的其他线程启动w2,这样可以防止w2被禁用

Thread newWindowThread = new Thread(new ThreadStart(ThreadStartingPoint));
newWindowThread.SetApartmentState(ApartmentState.STA);
newWindowThread.IsBackground = true;
newWindowThread.Start();



private void ThreadStartingPoint()
      {
         Window3 tempWindow = new Window3();
         tempWindow.Show();
         System.Windows.Threading.Dispatcher.Run();
      }