我正在构建一个小应用程序,它对另一个软件的程序文件执行更新,然后启动该软件。启动应用程序后,第二个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;
什么都不做......这是实现这个目标的正确方法吗?
答案 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中解决了这个问题:
启动主应用程序后,启动程序通过P / Invoke调用AllowSetForegroundWindow
以允许主应用程序设置前景窗口(如果启动器处于活动状态,则允许这样做。)
主应用程序通过P / Invoke调用SetForegroundWindow
将前景窗口设置为其主shell窗口。
......或者其他类似的东西。可能是在等待应用程序的主窗口变为活动状态后调用SetForegroundWindow
的启动程序。这是一段时间以前,我不再有权访问源。
答案 2 :(得分:0)
感谢Mike和Sheridan的回答,我发现解决方案只是在创建它的线程中激活窗口。所以
var shell = (Shell) Shell;
Application.Current.MainWindow = shell;
shell.Topmost = true;
shell.Show();
shell.InjectInitialViews();
shell.Activate();
诀窍。