将MainWindow置于前面,而不是始终位于顶部,并等待它关闭

时间:2015-06-29 12:45:54

标签: c# wpf windows-7

我有一个WPF配置实用程序,它有一个在我的WIX安装程序中运行的窗口,也可以在安装后独立运行。 SO包含将窗口置于前面的解决方案,但它们使其始终位于顶部或代码立即返回。

当应用程序启动时,我想将窗口置于前面。离开它自己,它弹出我的MSI对话框。我还想让用户在其上移动其他窗口(它不应该总是在顶部),我想等待窗口关闭代码。也许我太挑剔了,因为WPF似乎不支持这个。

目前,我有这个:

MainWindow.Topmost = true;
MainWindow.Show();
MainWindow.Activate();
MainWindow.Topmost = false;
MainWindow.Focus();

除了MainWindow.Show()立即返回并执行恢复之外,它很棒。在过去,我们使用

MainWindow.TopMost = true;
MainWindow.ShowDialog();

但是这个窗口始终位于顶部并阻碍所有其他窗口(不是最好的用户体验)。还有其他选择吗?请随意建议我也错误地构建这个。谢谢!

2 个答案:

答案 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可能不是最好的主意,因为它会在任何窗口前移动对话框(甚至是用户在安装程序前面移动的对话框)。 也许你应该添加另一个没有额外窗口的自定义操作?

相关问题