在 WPF 中禁用“仅所有者”窗口



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

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

总之:当 W2 打开时

  • 应用程序继续运行

  • 只有 W1 被禁用

我试过了

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

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

如果我使用

W2.ShowDialog()

然后整个应用程序将被阻止。是否有某种方法可以禁用只有父窗口(/owner)?

这应该回答你的问题:

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

考虑 3 个窗口 w1w2w3 。 最初显示W1W2。从您调用W3.ShowDialog() W1,这将禁用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();
      }

最新更新