如果我创建一个派生自System.Windows.Window的类并使用ShowDialog显示它,它会按预期显示在主窗口上方,并且主窗口被禁用。 但是可以将两个窗口放在其他应用程序之后,然后将主窗口拉回来。这只留下一个似乎已经崩溃的窗口,并且可能令人困惑。
如果显示主窗口,是否可以确保始终显示对话框窗口? MessageBox.Show对话框没有这样的问题
更新
测试对话框定义为
public partial class MyDialog : Window
{
public MyDialog()
{
InitializeComponent();
}
}
并使用
进行调用 MyDialog d = new MyDialog();
d.ShowDialog();
答案 0 :(得分:7)
您必须设置所有者属性。
MyDialog d = new MyDialog();
d.Owner = Application.Current.MainWindow;//or your owning window
d.ShowDialog();
答案 1 :(得分:1)
要确保在显示主窗口时始终显示对话框窗口,请根据主要可见性向主窗体可见性更改事件添加处理程序以将TopMost
true或false设置为子窗体
ChildForm frmDLg = null;
public MainForm()
{
this.VisibleChanged += MainFrmVisibleChanged;
}
private void LoadDialogForm()
{
try {
if (frmDLg == null || frmDLg.IsDisposed) {
frmDLg = new ChildForm();
}
frmDLg.ShowDialog();
} catch (Exception ex) {
//Handle exception
}
}
private void MainFrmVisibleChanged(object sender, System.EventArgs e)
{
if (frmDLg != null && !frmDLg.IsDisposed) {
frmDLg.TopMost = this.Visible;
}
}
<强>更新强>
public override bool Visible
{
get
{
return base.Text;
}
set
{
base.Text = value;
// Insert my code
if (frmDLg != null && !frmDLg.IsDisposed)
{
frmDLg.TopMost = this.Visible;
}
}
}
我能想到的最后一种方法是使用带有user32 dll getforegroundwindow的计时器来检查主表单是否可见。
答案 2 :(得分:1)
此代码应该可以随意使用
public MainWindow()
{
InitializeComponent();
this.Activated += new EventHandler(MainWindow_Activated);
}
void MainWindow_Activated(object sender, EventArgs e)
{
if (m == null)
return;
m.Activate();
}
private void button1_Click(object sender, RoutedEventArgs e)
{
m = new MyDialog();
m.ShowDialog();
}
MyDialog m;