C# 如何使窗口显示在所有其他窗口的顶部?

C# 如何使窗口显示在所有其他窗口的顶部?,c#,wpf,xaml,C#,Wpf,Xaml,我正在构建一个小应用程序,它对另一个软件的程序文件执行更新,然后启动这个软件。启动应用程序后,第二个GUI线程中会显示一个启动窗口,而在主线程上会构造并显示第二个应用程序的主窗口: var shell = (Shell) Shell; Application.Current.MainWindow = shell; shell.Show(); 显示第二个应用程序的外壳后,第一个窗口关闭。一切正常,除了第二扇窗户的外壳在其他窗户下面弹出。即:我从资源管理器启动launcher应用程序,launch

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

var shell = (Shell) Shell;
Application.Current.MainWindow = shell;
shell.Show();
显示第二个应用程序的外壳后,第一个窗口关闭。一切正常,除了第二扇窗户的外壳在其他窗户下面弹出。即:我从资源管理器启动launcher应用程序,launcher窗口显示在资源管理器窗口的顶部。启动器窗口关闭,主应用程序窗口出现在浏览器窗口下:

我试过:

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;

什么都不做。。。实现这一点的正确方法是什么?

在第二个示例中没有任何意义,因为UI在程序执行期间不会更新,因此,您对
shell.topmest=true的调用将被忽略。实现目标的更好方法可能是处理以下事件:


如果我没记错的话,我通过执行以下操作在带有外部启动器的WPF智能客户端中解决了此问题:

  • 启动主应用程序后,启动器通过p/Invoke调用
    allowsetforegroundindow
    ,以允许主应用程序设置前台窗口(如果启动器处于活动状态,则允许此操作)

  • 主应用程序通过p/Invoke调用
    setforegroundindow
    ,将前台窗口设置为其主shell窗口


  • …或者类似的东西。可能是启动器在等待应用程序主窗口激活后调用了
    setforegroundindow
    。这是很久以前的事了,我再也无法访问源代码。

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

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

    做的很好。

    谢谢Mike,我的情况实际上更简单,因为我可以在创建它的线程中激活窗口,所以不需要在这里跨线程执行。你的回答帮助我找到了答案,谢谢。嗨,谢里登,谢谢你的回答。缺少的只是一个shell.Activate(),因此您对事件的了解非常接近。我不知道Activate()方法,尽管它非常简单。谢谢
    var shell = (Shell) Shell;
    Application.Current.MainWindow = shell;
    shell.Topmost = true;
    shell.Show();
    shell.InjectInitialViews();
    shell.Activate();