将WPF应用程序作为隐藏启动

时间:2014-09-16 21:12:23

标签: wpf

我正在编写WPF应用程序并希望它作为隐藏窗口启动。我在调用Visibility之前创建了Window对象并将其Visibility.Hidden属性设置为Application.Run()。然后,我有Window.Loaded的事件处理程序,它还将可见性设置为Visibility.Hidden。在调用Application.Run()和回调到OnWindowLoaded()之间,窗口的黑色轮廓在屏幕上闪烁然后消失。这就像窗口管理器正在为窗口或其他东西创建一个投影,然后立即隐藏它。

通过仪器运行我的项目后,我终于发现Window.Show()以某种方式被调用。所以,我查看了http://www.dotnetframework.org/Search.aspx的源代码:

  • Application.Run()最终会调用名为Application.RunInternal()的私有方法。
  • RunInternal()检查传递给Run()方法的Window对象的可见性。
  • 如果Visibility媒体资源不是Visibility.Visible,则会调用Window.Show()

然后我查看了System.Windows.Window的源代码:

  • Window.Show()Visibility属性(窗口)设置为Visibility.Visible

基于此,我没有看到如何强制窗口保持隐藏状态。通过尝试在启动时使窗口不可见,我正在使Application对象调用Window.Show();我不明白为什么Application对象甚至关心窗口的可见性。这是令人沮丧的经历...: - (

我已经看到其他答案说不要打电话给Application.Run()而是设置你自己的事件调度员,但这似乎有点过分了。我只是希望主窗口保持隐藏状态,因为没有“闪烁”出现在应用程序启动时,并且当我准备好它时窗口变得可见(这在我的应用程序逻辑中稍后发生)。

有人可以提出建议吗?

2 个答案:

答案 0 :(得分:2)

对此答案的评论最终使我找到了解决此问题的方法。我需要一次在多个屏幕上显示多个窗口,并且通过最小化窗口,它可以提供所需的性能。谢谢。

答案 1 :(得分:0)

您是否删除了StartupUri中的App.xaml条目?如果这样做,App类不会为您实例化窗口并显示它。您可以通过覆盖App.OnStartup方法自行完成此操作。

基本上,我在这个OnStartup方法中构建了一个composition root,并在流程结束时创建了一个窗口:

    protected override void OnStartup(StartupEventArgs e)
    {
        base.OnStartup(e);

        // Do your custom initialization code here

        MainWindow = new MainWindow();
        MainWindow.Show();
    }

如果你真的想省略整个应用程序构建过程(我不建议,因为你没有像应用程序资源的回退那样的功能),你可以创建一个{{1}你自己使用这段代码:

Dispatcher