2014-04-25 16 views
5

jeder,Wie öffne ich WPF-Fenster im selben pragrom/Anwendung?

Ich möchte eine Anwendung, die Fenster zu öffnen und zu schließen Multi-Zeit steuern konnte. Drücken Sie beispielsweise 1, öffnen Sie ein Fenster; drücke 2, schließe das Fenster.

Und da ist mein Code den ich gefunden habe, der das nur einmal machen konnte.

Kann jemand nett sein, mir zu helfen, es zu korrigieren? Danke vielmals.

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); 
    } 

Antwort

2

Beim Herunterfahren der App von app.Shutdown() telefonieren Sie zuerst brauchen würden, um sie auszuführen wieder ein Fenster zu öffnen.

Sie sollten einen Verweis auf Ihr Fenster speichern und es schließen, anstatt die gesamte App herunterzufahren. Um das zu tun, dass Sie eine Versandart benötigen, die den Bezug des Fensters zurückkehren können:

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);   
} 
+0

dank viel, aber ich habe eine weitere Ausnahme: Der aufrufende Thread dieses Objekt nicht zugreifen, da ein anderer Thread sie besitzt . – cindywmiao

+0

oh mein Schlechter, ich habe meine Antwort bearbeitet. Bitte prüfen Sie, ob das hilft. – Tobi

+0

Ich habe einen anderen Fehler über die neue Funktion als Sie hinzufügen, zwischen Invoke und : Die nicht-generische Methode 'System.Windows.Threading.Dispatcher.Invoke (System.Delegate, System.TimeSpan, System.Windows.Threading.DispatcherPriority, params object []) 'kann nicht mit Typ Argumenten verwendet werden – cindywmiao

Verwandte Themen