我有一个WPF配置实用程序,它有一个在我的WIX安装程序中运行的窗口,也可以在安装后独立运行。 SO包含将窗口置于前面的解决方案,但它们使其始终位于顶部或代码立即返回。
当应用程序启动时,我想将窗口置于前面。离开它自己,它弹出我的MSI对话框。我还想让用户在其上移动其他窗口(它不应该总是在顶部),我想等待窗口关闭代码。也许我太挑剔了,因为WPF似乎不支持这个。
目前,我有这个:
MainWindow.Topmost = true;
MainWindow.Show();
MainWindow.Activate();
MainWindow.Topmost = false;
MainWindow.Focus();
除了MainWindow.Show()
立即返回并执行恢复之外,它很棒。在过去,我们使用
MainWindow.TopMost = true;
MainWindow.ShowDialog();
但是这个窗口始终位于顶部并阻碍所有其他窗口(不是最好的用户体验)。还有其他选择吗?请随意建议我也错误地构建这个。谢谢!
答案 0 :(得分:2)
您可以修改MainWindow代码吗?如果是这样,只需将其放在代码隐藏中:
protected override void OnActivated(EventArgs e)
{
base.OnActivated(e);
this.Topmost = true;
this.Topmost = false;
}
然后,无论您使用.Show()
还是.ShowDialog()
,每次启动窗口时,它都会自动移到前面。
编辑:如果您不能/不会修改MainWindow代码,您可以对Activated
事件进行相同的订阅:
MainWindow.Activated += new EventHandler(window_Activated);
MainWindow.ShowDialog(); // or .Show()
...
void window_Activated(object sender, EventArgs e)
{
var window = sender as MainWindow;
window.Topmost = true;
window.Topmost = false;
}
答案 1 :(得分:-2)
而不是使用
MainWindow.ShowDialog();
使用之前的代码后,您可以覆盖窗口的Closing事件:
MainWindow.Topmost = true;
MainWindow.Show();
MainWindow.Activate();
MainWindow.Topmost = false;
MainWindow.Focus();
}
/// <summary>
/// Raises the <see cref="E:System.Windows.Window.Closing"/> event.
/// </summary>
/// <param name="e">A <see cref="T:System.ComponentModel.CancelEventArgs"/> that contains the event data.</param>
protected override void OnClosing(CancelEventArgs e)
{
base.OnClosing(e);
}
编辑:
在结束事件中,您可以使用回调(来自调用者),在关闭此窗口后继续。
或者,您应检查安装程序窗口的位置,然后调用
MainWindow.ShowDialog();
从而阻止MainWindow始终处于最顶端。 在MainWindow关闭之前,它将阻止执行调用者。
编辑2: 使用topmost可能不是最好的主意,因为它会在任何窗口前移动对话框(甚至是用户在安装程序前面移动的对话框)。 也许你应该添加另一个没有额外窗口的自定义操作?