以下代码演示了我在关闭子窗口时最小化父窗口的问题,我不希望这种情况发生。
class SomeDialog : Window
{
protected override void OnMouseDoubleClick(MouseButtonEventArgs e)
{
base.OnMouseDoubleClick(e);
new CustomMessageBox().ShowDialog();
}
}
class CustomMessageBox : Window
{
public CustomMessageBox()
{
Owner = Application.Current.MainWindow;
}
}
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
}
protected override void OnMouseDoubleClick(MouseButtonEventArgs e)
{
base.OnMouseDoubleClick(e);
new SomeDialog() { Owner = this }.Show();
}
}
Window1是主要的应用程序窗口。
SomeDialog是一个窗口,在Window1中弹出一些事件(双击示例中的window1),需要无模式。
CustomMessageBox是一个窗口,弹出“SomeDialog”中的某个事件(双击示例中的SomeDialog),需要模态。
如果您运行该应用程序,然后双击Window1的内容以显示SomeDialog,然后双击SomeDialog的内容以显示CustomMessagebox。
现在关闭CustomMessagebox。细
现在如果你关闭SomeDialog,Window1最小化?为什么它会最小化,我该如何阻止它呢?
修改:使用Viv提出的技术,似乎解决方法相当简单。
class SomeDialog : Window
{
protected override void OnMouseDoubleClick(MouseButtonEventArgs e)
{
base.OnMouseDoubleClick(e);
new CustomMessageBox().ShowDialog();
}
protected override void OnClosing(System.ComponentModel.CancelEventArgs e)
{
base.OnClosing(e);
Owner = null;
}
}
答案 0 :(得分:11)
为什么它会最小化,我该如何阻止它呢?
不确定“为什么”也许您可以将其报告为错误并查看他们回复的内容,就像您不希望这种情况发生的非模态对话框一样。
至于解决方法,请尝试以下方法:
public partial class MainWindow : Window {
...
protected override void OnMouseDoubleClick(MouseButtonEventArgs e) {
base.OnMouseDoubleClick(e);
var x = new SomeDialog { Owner = this };
x.Closing += (sender, args) => {
var window = sender as Window;
if (window != null)
window.Owner = null;
};
x.Show();
}
}
^^这可以防止MainWindow
(父级)在SomeDialog
关闭时最小化。
答案 1 :(得分:3)
我对这个有趣问题的解决方法是激活MainWindow一次,之后再次激活SomeDialog窗口。
class SomeDialog : Window
{
protected override void OnMouseDoubleClick(MouseButtonEventArgs e)
{
base.OnMouseDoubleClick(e);
new CustomMessageBox().ShowDialog();
Owner.Activate();
Activate();
}
}
答案 2 :(得分:3)
一个非常晚的答案......我只是坐在同样的问题上,而Viv的解决方法也为我解决了这个问题。至于"为什么"作为答案的一部分,我相信当你的孩子的窗口在其生命周期中生成一个自己的子窗口时,它会发生 。 根据我的经验,只要按下我的保存按钮就会发生这种情况,该按钮位于需要打开子窗口的流程中。但是按下取消(或转义)或Windows默认退出按钮不会调用此问题。
答案 3 :(得分:0)
首先,正如你的代码所示,我可以证实这种奇怪的行为。我在这里注意到两件事。第一个是SomeDialog.Owner
不设置,或者使用此代码以null
值结束:
new SomeDialog() { Owner = this }.Show();
添加此代码可修复该问题:
public SomeDialog()
{
Owner = Application.Current.MainWindow;
}
不幸的是,当孩子MainWindow
关闭时,这并不会阻止Window
被最小化。然后我发现我可以阻止它被最小化,但只有在调用new SomeDialog().ShowDialog();
而不是new SomeDialog().Show();
时才会这样做但是,这会使Window
成为一个对话框,这不是你所追求的我相信。
答案 4 :(得分:0)
我们有类似的问题,但原因很简单。 Window的方法Close()被调用两次。在我们取消第二次通话后,所有人都恢复正常。