从控制台应用程序启动 WPF 窗口

Posted

技术标签:

【中文标题】从控制台应用程序启动 WPF 窗口【英文标题】:Launching a WPF window from a Console application 【发布时间】:2022-01-14 13:39:32 【问题描述】:

我正在尝试使用 WPF 窗口作为消息弹出窗口,该窗口将在执行任务后关闭。我看到的所有文档都说这不能用 messageBox 完成,这就是我使用 WPF 的原因。我找到了一个代码片段,它允许我打开 WPF 窗口,但它不会将应用程序推进到下一个进程。下面是我发现的最后一个代码示例,我认为它显示了承诺,但窗口没有打开 -

        [STAThread]
        static void Main(string[] args)
        
            try
            
                string filePath = "my new directory";
                var popup = new PopupTest();

                popup.Dispatcher.BeginInvoke
                    (System.Windows.Threading.DispatcherPriority.Normal,
                    (Action)(() =>
                    
                        popup.Show();
                        
                    ));

                // Do some console application stuff

                do
                
                    Directory.CreateDirectory(filePath);
                 while (!Directory.Exists(filePath));

                popup.Close();            
            
            catch (Exception e)
            
                Console.WriteLine(e.Message);
                Console.WriteLine(e.StackTrace);
            
        
     

cs.xaml 文件只是默认文件

    /// Interaction logic for PopupTest.xaml
    /// </summary>
    public partial class PopupTest : Window
    
        public PopupTest()
        
            InitializeComponent();
        
    

我觉得这应该比我做的更简单。任何可以为我指明正确方向的东西都会受到赞赏。

【问题讨论】:

恕我直言,如果您想显示某种窗口,只需创建一个 WPF 应用程序。为什么要混合控制台和 ui 项目,为什么两者都需要? This may be worth 也结帐。 此功能(在操作完成之前弹出警告)正在包含在更大的现有应用程序中。我所包含的只是我在网上找到的一种方法。我查看了您包含的链接,Application app = new Application (); app.Run(new Window1()); 打开了窗口,但不允许应用程序继续。我尝试将该行添加到它自己的线程`var popup = new PopupTest();应用程序 = 新应用程序();线程 thread1 = new Thread(()=> app.Run(popup)); thread1.Start(); ` 但这也不会打开窗口 【参考方案1】:

您需要引用 WPF 程序集并在 STA 线程上创建并运行 System.Windows.Application

[STAThread]
static void Main(string[] args)

    var app = new System.Windows.Application();
    app.Run(new PopupTest());

Run 方法阻塞并且在应用关闭之前不会返回。

如果您想在应用程序运行时做一些事情,您需要在另一个线程上执行此操作:

    [STAThread]
    static async Task Main(string[] args)
    

        Task t = Task.Run(() => 
        
            string filePath = "my new directory";
            do
            
                Directory.CreateDirectory(filePath);
             while (!Directory.Exists(filePath));
        );

        var app = new System.Windows.Application();
        app.Run(new MainWindow());

        await t;
    

【讨论】:

朝着正确的方向前进,但任务完成后我无法关闭窗口。使用上面的代码作为起点,我尝试将app.MainWindow.Close(); 放在app.Run 之后,但似乎这条线永远不会被击中。我尝试在任务之前实例化窗口并将app.MainWindow.Close() 放在任务中,在while 循环之后,但这似乎冻结了应用程序。 您不会等待任务直到窗口和应用程序已关闭。正如我所说,“Run 方法阻塞并且在应用程序关闭之前不会返回。”你想达到什么目的?您希望何时以及如何关闭窗口?

以上是关于从控制台应用程序启动 WPF 窗口的主要内容,如果未能解决你的问题,请参考以下文章

从控制台应用程序 exe 在 DLL 中启动 WPF 应用程序

如何在 WPF 中从一个窗口移动到另一个窗口?

WPF编程窗口在哪启动?

如何强制WPF启动窗口到特定的屏幕?

开发向导 UI - WPF

如何使用 xaml 将 WPF 应用程序窗口启动位置设置为右上角?