WPF如何改变窗口的模态状态

4
在WPF中,是否可以将窗口从模态切换为非模态?也就是说,我使用...ShowDialog();打开窗口,但后来想要切换状态(比如使用...Show();打开窗口)。

你写了一个自定义的窗口吗? - Gary Wright
不,这只是一个简单的WPF窗口。 - BendEg
1个回答

2
假设您想从“主”窗口切换到非模态窗口,您可以执行以下操作,其中Window1在5秒后变为非模态。
这种方法的缺点是对话框会闪烁。
private Window1 myWindow = new Window1();

private void MyButton_Click(object sender, RoutedEventArgs e)
{
    // Using a timer to simulate something happening 5 seconds later that would cause dialog state to change
    DispatcherTimer dispatcherTimer = new DispatcherTimer();
    dispatcherTimer.Tick += new EventHandler(dispatcherTimer_Tick);
    dispatcherTimer.Interval = new TimeSpan(0, 0, 5);
    dispatcherTimer.Start();
    // The following line will block until you switch the dialog from modal to non-modal
    myWindow.ShowDialog();            
}

private void dispatcherTimer_Tick(object sender, EventArgs e)
{
    (sender as DispatcherTimer).Stop();
    myWindow.Hide();
    myWindow.Show();
}

如果您想要将窗口从模态切换到非模态,可以在窗口本身调用Hide(),然后再调用Show()来完成同样的事情(但会有闪烁)。
private void SwitchToModelessButton_Click(object sender, RoutedEventArgs e)
{
    this.Hide();
    this.Show();
}

值得注意的是,当您进行此切换时,'master'窗口调用ShowDialog()将返回。

1
不,客户要求在模态窗口中添加一个按钮,用于切换状态。但是我会尝试使用 this.Hide()this.Show() 来实现这个功能。 - BendEg
啊,这就是我问它是否为自定义窗口的原因。 - Gary Wright
好的,在我的简单演示中,这个代码可以正常工作:private void Button_Click(object sender, RoutedEventArgs e) { TestWindow w = new TestWindow(); w.ShowDialog(); }。有没有其他解决方案,而不需要隐藏和显示? - BendEg
编辑了答案以包括隐藏对话框窗口代码。我不知道是否有其他方法可以在不先隐藏窗口的情况下完成,但如果有人提出替代方案,我很乐意被证明是错误的。这至少可以实现您的需求。 - Gary Wright

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接