我有一个应用程序,其中有一个窗口(假设 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 个窗口 w1
, w2
, w3
。 最初显示W1
和W2
。从您调用W3.ShowDialog()
W1
,这将禁用w1
和w2
,因为它们都在同一UI线程上运行。我相信您的要求是仅禁用w1
或w2
中的一个。(在这种情况下,假设您要启用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();
}