从Console App显示Wpf窗口

时间:2017-04-13 09:21:01

标签: c# wpf

我很容易尝试从控制台应用程序显示WPF窗口。在我的解决方案中,我得到了一个控制台应用程序,它是启动项目,并创建一个像这样的Wpf窗口:

class Program
{
    [STAThread]
    static void Main(string[] args)
    {
        var thread = new Thread(Foo);
        thread.Start();

        Console.ReadKey();
    }

    private static void Foo()
    {
        var markerService = new MarkerService();
        var viewModel = new MainViewModel();
        markerService.Register(viewModel);
        var mainView = new MainWindow { DataContext = viewModel };
        mainView.Show();
    }
}

MainWindowMainViewModel只是空的。当我启动项目时显示Wpf窗口但没有响应(光标正忙)。

感谢任何帮助。

问候

2 个答案:

答案 0 :(得分:1)

您需要使用Dispatcher.Run来启动消息循环。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using WpfApplication1;
using System.Windows.Threading;

namespace ConsoleApplication2
{
    class Program
    {
        [STAThread]
        static void Main(string[] args)
        {
            var thread = new Thread(Foo);
            thread.ApartmentState = ApartmentState.STA;
            thread.Start();

            Console.ReadKey();
        }

        private static void Foo()
        {
            var markerService = new MarkerService();
            var viewModel = new MainViewModel();
            markerService.Register(viewModel);
            var mainView = new MainWindow { DataContext = viewModel };
            mainView.Show();

            Dispatcher.Run();
        }
    }
}

或者你可以使用@ mm8建议的“应用程序”对象样式,或者第三种方法就是:

        mainView.ShowDialog(); // internal message pump used

更多信息:

答案 1 :(得分:0)

创建一个System.Windows.Application对象并调用其Run方法:

class Program
{
    [STAThread]
    static void Main(string[] args)
    {
        var thread = new Thread(Foo);
        thread.SetApartmentState(ApartmentState.STA);
        thread.Start();

        Console.ReadKey();
    }

    private static void Foo()
    {
        var markerService = new MarkerService();
        var viewModel = new MainViewModel();
        markerService.Register(viewModel);
        var mainView = new MainWindow { DataContext = viewModel };
        System.Windows.Application app = new System.Windows.Application();
        app.Run(mainView);
    }
}

请注意,运行应用程序并显示窗口的线程必须是STA。

您需要添加对PresentationFramework.dll和WindowsBase.dll的引用。