Wenn sich die Fenster öffnen, braucht es jemand

Einmal musste ich ein Fenster aus einer Konsolenanwendung öffnen. Ich wollte dies mit wpf tun, aber es gab nur wenige Informationen im Netzwerk, deshalb habe ich beschlossen, dieses kleine Tutorial irgendwie zu organisieren und einzureichen.

Erstellen Sie eine reguläre Konsolenanwendung im .net-Framework.



Jetzt müssen Sie die Abhängigkeiten hinzufügen: WindowsBase, PresentationCore, PresentationFramework.



Fügen Sie die Klasse unseres Fensters hinzu und erben Sie sie von den Standardfenstern von Windows.

public class MyWindow : Window{} 

Fügen Sie der Hauptmethode das Attribut [STAThread] hinzu

Warum
STAThreadAttribute ist im Wesentlichen eine Voraussetzung für das Messaging mit einem Windows-Nachrichtenserver mit COM-Komponenten
Und im Detail.


 [STAThread] public static void Main(string[] args){} 

Erstellen Sie jetzt unser Fenster:

  [STAThread] public static void Main(string[] args) { var win = new MyWindow { Width = 350, Height = 350}; var grid = new Grid(); var text = new TextBox {Text = "my text"}; grid.Children.Add(text); win.Content = grid; } 

Wenn wir jetzt die Show () -Methode für das Fenster aufrufen, wird sie sofort zusammenbrechen. Da wir sie uns ständig ansehen möchten, müssen wir dieses Fenster in einen Container verschieben, der den gesamten Lebenszyklus unterstützt.

 app.MainWindow = win; app.MainWindow.Show(); app.Run(); 

Wir haben ein Fenster angezeigt, und es fühlt sich ziemlich gut an, aber das Schließen aus dem Code ist nicht so einfach: Die Run () -Methode ist eine Endlosschleife, und die Anwendung kann nur von demselben Thread gestoppt werden, in dem sie aufgerufen wird. Ausgabe:

 Task.Run(async () => { await Task.Delay(1000); app.Dispatcher.Invoke((Action) delegate { app.Shutdown(); }); }); ; 

Dann sieht die ganze Methode aus
so.
 [STAThread] public static void Main(string[] args) { var app = new Application(); var win = new MyWindow { Width = 350, Height = 350}; var grid = new Grid(); var text = new TextBox {Text = "my text"}; grid.Children.Add(text); win.Content = grid; app.MainWindow = win; app.MainWindow.Show(); Task.Run(async () => { await Task.Delay(1000); app.Dispatcher.Invoke((Action) delegate { app.Shutdown(); }); }); app.Run(); } 

und hier ist die Quelle


Eine angenehme Lösung besteht nicht darin, unser Fenster aus Code zu machen, sondern zum bekannteren xaml zu wechseln.

Fügen Sie dazu die Abhängigkeit System.Xml hinzu.
Und machen Sie ein XAML-Dokument.
 <Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:ConsoleApplication1" mc:Ignorable="d" Title="MyWindow" Height="450" Width="800"> <Grid> <Label Content="Label" /> </Grid> </Window> 


Laden Sie nun die Daten aus der Datei.
 XmlTextReader r = new XmlTextReader("MyWin.xaml"); var win = XamlReader.Load(r) as Window; 


Und in diesem Fall sieht der endgültige Main aus
so.
 [STAThread] public static void Main(string[] args) { var app = new Application(); XmlTextReader r = new XmlTextReader("MyWin.xaml"); var win = XamlReader.Load(r) as Window; app.MainWindow = win; app.MainWindow.Show(); Task.Run(async () => { await Task.Delay(1000); app.Dispatcher.Invoke((Action) delegate { app.Shutdown(); }); }); app.Run(); } 



PS
Danke an den # Chat in tg und User Yuri .

Source: https://habr.com/ru/post/de437642/


All Articles