c# - 我如何在同一个程序/应用程序中重新打开 WPF 窗口?

标签 c# wpf

各位

我想要一个可以多次控制窗口打开和关闭的应用程序。比如按1,打开一个窗口;按 2,关闭窗口。

我找到了我的代码,它只能执行一次。

有人可以帮我改正吗?非常感谢。

public static void Main(string[] args)
    {
        var appthread = new Thread(new ThreadStart(() =>
        {
            app = new testWpf.App();
            app.ShutdownMode = ShutdownMode.OnExplicitShutdown;
            app.Run();
        }));
        appthread.SetApartmentState(ApartmentState.STA);
        appthread.Start();

        while (true)
        {

            var key = Console.ReadKey().Key;
            // press 1 to open
            if (key == ConsoleKey.D1)
            {
                DispatchToApp(() => new Window().Show());
            }
            // Press 2 to exit
            if (key == ConsoleKey.D2)
            {
                DispatchToApp(() => app.Shutdown());
            }
        }
    }

    static void DispatchToApp(Action action)
    {
        app.Dispatcher.Invoke(action);
    }

最佳答案

当您通过调用 app.Shutdown() 关闭您的应用程序时,您需要先再次运行它以打开它的窗口。

您应该保存对窗口的引用并关闭它,而不是关闭整个应用程序。为此,您需要一个能够返回窗口引用的调度方法:

static void Main(string[] args)
{
    var appthread = new Thread(new ThreadStart(() =>
    {
        app = new testWpf.App();
        app.ShutdownMode = ShutdownMode.OnExplicitShutdown;
        app.Run();
    }));
    appthread.SetApartmentState(ApartmentState.STA);
    appthread.Start();

    Window win = new Window();
    while (true)
    {
        var key = Console.ReadKey().Key;
        // press 1 to open
        if (key == ConsoleKey.D1)
        {
            win = DispatchToApp<Window>(() =>
            {
                var myWindow = new Window();
                myWindow.Show();
                return myWindow;
            });
        }
        // Press 2 to exit
        if (key == ConsoleKey.D2)
        {
            DispatchToApp(() => win.Close());
        }
    }
}

static TReturn DispatchToApp<TReturn>(Func<TReturn> action)
{
    return app.Dispatcher.Invoke<TReturn>(action);
}

static void DispatchToApp(Action action)
{
    app.Dispatcher.Invoke(action);        
}

关于c# - 我如何在同一个程序/应用程序中重新打开 WPF 窗口?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23304806/

相关文章:

c# - 无法将 nuget 包安装到 azure 函数中

c# - ASP.NET MVC - 检测在页面上花费的时间

c# - 拖动时显示带有鼠标光标的图像缩略图

c# - 如何在触摸屏中滚动 ListView

c# - 更改按钮内容 MVVM

.net - 错误模板显示在其他控件之上,而本应隐藏它

c# - 如何让一个类首先在 Winforms 应用程序中运行

c# - ActionFilterAttribute 范围调用顺序

c# - 如何避免在 C# 类之前编写命名空间

c# - 命令在我的附加属性中获取 null 用于将事件转换为命令