إذا كانت النوافذ مفتوحة ، فسيحتاجها شخص ما

بمجرد أن أحتاج لفتح نافذة من تطبيق وحدة التحكم. كنت أرغب في القيام بذلك باستخدام wpf ، ولكن كان هناك القليل من المعلومات المنتشرة عبر الشبكة ، لذلك قررت تنظيم هذا البرنامج التعليمي الصغير وإرساله بطريقة أو بأخرى.

قم بإنشاء تطبيق وحدة تحكم منتظم على إطار عمل .net.



تحتاج الآن إلى إضافة التبعيات: WindowsBase و PresentationCore و PresentationFramework.



أضف فئة نافذتنا ، ورثها من النوافذ القياسية لنظام Windows.

public class MyWindow : Window{} 

أضف السمة [STAThread] إلى الطريقة الرئيسية

لماذا
STAThreadAttribute هو شرط أساسي للمراسلة مع خادم رسائل Windows مع مكونات COM
وبمزيد من التفصيل.


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

الآن قم بإنشاء نافذتنا:

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

إذا اتصلنا الآن بأسلوب Show () على النافذة ، فسوف ينهار على الفور ، وبما أننا نود أن ننظر إليه طوال الوقت ، فإننا نحتاج إلى دفع هذه النافذة إلى حاوية تدعم دورة الحياة بأكملها.

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

لقد عرضنا نافذة ، وهي في حالة جيدة ، لكن إغلاقها من الكود ليس بالأمر السهل: طريقة Run () هي حلقة لا نهاية لها ، ويمكن إيقاف التطبيق فقط من نفس الخيط الذي يتم استدعاؤه. الإخراج:

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

ثم تبدو الطريقة بأكملها
هكذا
 [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(); } 

وهنا المصدر


الحل الممتع هو عدم جعل نافذتنا خارج الشفرة ، بل التبديل إلى xaml الأكثر دراية.

للقيام بذلك ، قم بإضافة التبعية System.Xml.
وجعل وثيقة 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> 


الآن تحميل البيانات من الملف.
 XmlTextReader r = new XmlTextReader("MyWin.xaml"); var win = XamlReader.Load(r) as Window; 


وفي هذه الحالة ، النظرات الرئيسية النهائية
هكذا
 [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
بفضل # الدردشة في tg والمستخدم يوري .

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


All Articles