如何使窗口出现在所有其他窗口的顶部?

时间:2013-11-11 12:56:11

标签: c# wpf xaml

我正在构建一个小应用程序,它对另一个软件的程序文件执行更新,然后启动该软件。启动应用程序后,第二个GUI线程中会显示一个启动窗口,而在主线程上构建并显示第二个应用程序的主窗口:

var shell = (Shell) Shell;
Application.Current.MainWindow = shell;
shell.Show();

显示第二个应用程序的shell后,第一个窗口关闭。一切都运行正常,除了第二个窗口的外壳弹出 *其他窗口。即:我从资源管理器启动启动器应用程序,启动器窗口显示在资源管理器窗口的顶部。启动器窗口关闭,主应用程序窗口显示在资源管理器窗口下:

我试过了:

var shell = (Shell) Shell;
Application.Current.MainWindow = shell;
shell.Topmost = true;
shell.Show();
shell.InjectInitialViews();

解决了这个问题,但是即使我点击任务栏中的另一个应用程序,我也无法在shell上方显示其他窗口。

var shell = (Shell) Shell;
Application.Current.MainWindow = shell;
shell.Topmost = true;
shell.Show();
shell.InjectInitialViews();
shell.Topmost = false;

什么都不做......这是实现这个目标的正确方法吗?

3 个答案:

答案 0 :(得分:1)

在您的第二个示例中没有意义,因为在程序执行期间,用户界面更新,因此,您对shell.Topmost = true;的调用将被忽略。实现目标的更好方法可能是处理Window.Deactivated和可能Window.Activated事件:

private void SecondWindow_Deactivated(object sender, EventArgs e)
{
    MainWindow window = (MainWindow)sender;
    window.TopMost = true;
}

答案 1 :(得分:1)

如果我没记错的话,我通过执行以下操作在具有外部启动器的WPF Smart Client中解决了这个问题:

  1. 启动主应用程序后,启动程序通过P / Invoke调用AllowSetForegroundWindow以允许主应用程序设置前景窗口(如果启动器处于活动状态,则允许这样做。)

  2. 主应用程序通过P / Invoke调用SetForegroundWindow将前景窗口设置为其主shell窗口。

  3. ......或者其他类似的东西。可能是在等待应用程序的主窗口变为活动状态后调用SetForegroundWindow的启动程序。这是一段时间以前,我不再有权访问源。

答案 2 :(得分:0)

感谢Mike和Sheridan的回答,我发现解决方案只是在创建它的线程中激活窗口。所以

var shell = (Shell) Shell;
Application.Current.MainWindow = shell;
shell.Topmost = true;
shell.Show();
shell.InjectInitialViews();
shell.Activate();

诀窍。