C# 仅禁用wpf中的所有者窗口

C# 仅禁用wpf中的所有者窗口,c#,wpf,C#,Wpf,我有一个应用程序,其中有一个窗口(比如W1),我希望它在打开时不要阻止应用程序的处理。我使用W1.show()实现了这一点。从该窗口打开另一个窗口(W2) 我希望它的行为类似于一个模态,以便它禁用父窗口W1,但它不能禁用其余的应用程序 简言之: 当W2打开时 应用程序继续其操作 只有W1被禁用 我试过了 W1.IsEnabled = false; W2.Show(); W1.IsEnabled = true; 当它被打开时,它会将焦点移到W2

我有一个应用程序,其中有一个窗口(比如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
最初显示。从
W1
调用
W3.ShowDialog()
,这将禁用
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();
      }

w1中的哪些操作。。。使用IsEnabled手动禁用,并在w2关闭时重新启用它。如果我没有其他解决方案,这可能是一个选项,但1)其中有太多控件2)尝试单击它不应将焦点移到它(就像打开模式窗口一样)。需要什么操作来保持运行?实际上这是一个正在设计的应用程序。用户应该能够在主窗口(不是W1)中继续设计,这很好。还有几点1)当我们点击窗口W1时,它仍然会获得焦点2)如果可能的话,在打开W2后尝试点击W1,W2应该提供与在不同应用程序中打开“操作/另存为”对话框时相同的效果/动画,并且我们尝试使用主窗口而不是在我身边。自己检查:
W1.GotFocus+=W1_GotFocus。您是否像我发布的
关闭事件处理程序那样做了?是的,我已经测试了您在帖子中编写的代码,但没有向其中添加焦点代码。让我试一试这个答案实际上就是你问题的答案。主窗口始终可访问,直到W2打开,W1才可访问。关于样式-这是另一个问题,更广泛。对于disabled look out,您仍然可以使用
W1.IsEnabled=false和事件处理程序中的
W1.IsEnabled=true