Suatu ketika saya perlu membuka jendela dari aplikasi konsol. Saya ingin melakukan ini menggunakan wpf, tetapi ada sedikit informasi yang tersebar di seluruh jaringan, jadi saya memutuskan untuk mengatur dan mengirimkan tutorial kecil ini.
Buat aplikasi konsol biasa di kerangka .net.

Sekarang Anda perlu menambahkan dependensi: WindowsBase, PresentationCore, PresentationFramework.

Tambahkan kelas jendela kita, mewarisinya dari jendela standar Windows.
public class MyWindow : Window{}
Tambahkan atribut [STAThread] ke metode utama
MengapaSTAThreadAttribute pada dasarnya adalah prasyarat untuk pengiriman pesan dengan server pesan Windows dengan komponen COM
Dan lebih detail. [STAThread] public static void Main(string[] args){}
Sekarang buat jendela kita:
[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; }
Jika sekarang kita memanggil metode Show () di jendela, itu akan segera runtuh, dan karena kita ingin melihatnya setiap saat, kita perlu mendorong jendela ini ke dalam wadah yang mendukung seluruh siklus hidup.
app.MainWindow = win; app.MainWindow.Show(); app.Run();
Kami telah menampilkan jendela, dan rasanya cukup baik, tetapi menutupnya dari kode tidak begitu mudah: metode Run () adalah loop tanpa akhir, dan Aplikasi dapat dihentikan hanya dari utas yang sama tempat dipanggil. Keluaran:
Task.Run(async () => { await Task.Delay(1000); app.Dispatcher.Invoke((Action) delegate { app.Shutdown(); }); }); ;
Kemudian seluruh metode terlihat
jadi [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(); }
dan inilah sumbernya Solusi yang menyenangkan bukanlah membuat jendela kita keluar dari kode, tetapi untuk beralih ke xaml yang lebih akrab.
Untuk melakukan ini, tambahkan dependensi System.Xml.
Dan membuat dokumen xaml.
<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>
Sekarang muat data dari file.
XmlTextReader r = new XmlTextReader("MyWin.xaml"); var win = XamlReader.Load(r) as Window;
Dan dalam hal ini, Main utama terlihat
jadi [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
Berkat # obrolan di
tg dan pengguna
Yuri .