Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在同一个pragrom/应用程序中重新打开WPF窗口?_C#_Wpf - Fatal编程技术网

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

C# 如何在同一个pragrom/应用程序中重新打开WPF窗口?,c#,wpf,C#,Wpf,各位, 我想要一个应用程序,可以控制窗口打开和关闭多次。例如,按1,打开一个窗口;按2,关闭窗口 这是我找到的代码,只能执行一次 谁能帮我改正一下吗?非常感谢 public static void Main(string[] args) { var appthread = new Thread(new ThreadStart(() => { app = new testWpf.App(); app.Sh

各位,

我想要一个应用程序,可以控制窗口打开和关闭多次。例如,按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);        
}
static void Main(字符串[]args)
{
var appthread=新线程(新线程开始(()=>
{
app=newtestwpf.app();
app.ShutdownMode=ShutdownMode.OnExplicitShutdown;
app.Run();
}));
SetApartmentState(ApartmentState.STA);
appthread.Start();
win窗口=新窗口();
while(true)
{
var key=Console.ReadKey().key;
//按1打开
if(key==ConsoleKey.D1)
{
win=DispatchToApp(()=>
{
var myWindow=新窗口();
myWindow.Show();
返回我的窗口;
});
}
//按2退出
if(key==ConsoleKey.D2)
{
DispatchToApp(()=>win.Close());
}
}
}
静态TReturn DispatchToApp(功能动作)
{
返回app.Dispatcher.Invoke(操作);
}
静态无效DispatchToApp(操作)
{
app.Dispatcher.Invoke(操作);
}

非常感谢,但我遇到了另一个例外:调用线程无法访问此对象,因为另一个线程拥有它。关于新函数,在Invoke和之间,我还有一个错误:非泛型方法'System.Windows.Threading.Dispatcher.Invoke'(System.Delegate、System.TimeSpan、System.Windows.Threading.DispatcherPriority、params object[])不能与类型参数一起使用您必须使用有效的重载-我提供的重载就是其中之一。如果您更改签名,您必须确保它是有效的:我将VS2010更改为VS2013,并选择了NET4.5,没问题。非常感谢。@Tobi