gpt4 book ai didi

wpf - 以隐藏方式启动 WPF 应用程序

转载 作者:行者123 更新时间:2023-12-05 02:23:01 24 4
gpt4 key购买 nike

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

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

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

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

  • Window.Show() 将自身(窗口)的 Visibility 属性设置为 Visibility.Visible

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

我看到其他答案说不要调用 Application.Run() 而是设置您自己的事件调度程序,但这对于应该很容易的事情来说似乎有点过分了。我只希望主窗口保持隐藏状态,以免在应用程序启动时出现“闪烁”,并在我准备好让窗口可见时(稍后在我的应用程序逻辑中发生)。

谁能给个建议?

最佳答案

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

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

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

// Do your custom initialization code here

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

如果你真的想省略整个应用程序构建过程(我不推荐这样做,因为你不会有像回退到应用程序资源这样的功能),你可以创建一个 Dispatcher自己使用此代码:

var dispatcher = Dispatcher.CurrentDispatcher;
var synchronizationContext = new DispatcherSynchronizationContext(dispatcher);
SynchronizationContext.SetSynchronizationContext(synchronizationContext);
Dispatcher.Run();

关于wpf - 以隐藏方式启动 WPF 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25878507/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com