Se as janelas se abrirem, alguém precisará delas

Uma vez eu precisei abrir uma janela a partir de um aplicativo de console. Queria fazer isso usando o wpf, mas havia poucas informações espalhadas pela rede, então decidi de alguma forma organizar e enviar este pequeno tutorial.

Crie um aplicativo de console comum na estrutura .net.



Agora você precisa adicionar as dependências: WindowsBase, PresentationCore, PresentationFramework.



Adicione a classe da nossa janela, herdando-a das janelas padrão do Windows.

public class MyWindow : Window{} 

Adicione o atributo [STAThread] ao método principal

Porque
STAThreadAttribute é essencialmente um pré-requisito para o sistema de mensagens com um servidor de mensagens do Windows com componentes COM
E com mais detalhes.


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

Agora crie nossa janela:

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

Se agora chamarmos o método Show () na janela, ele entrará em colapso imediatamente e, como gostaríamos de analisá-lo o tempo todo, precisamos colocar essa janela em um contêiner que suporte todo o ciclo de vida.

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

Exibimos uma janela e ela parece muito boa, mas fechá-la a partir do código não é tão fácil: o método Run () é um loop sem fim e o Application pode ser parado apenas no mesmo encadeamento em que é chamado. Saída:

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

Então todo o método parece
então
 [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(); } 

e aqui está a fonte


Uma solução agradável não é tornar nossa janela sem código, mas mudar para o xaml mais familiar.

Para fazer isso, adicione a dependência System.Xml.
E faça um documento 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> 


Agora carregue os dados do arquivo.
 XmlTextReader r = new XmlTextReader("MyWin.xaml"); var win = XamlReader.Load(r) as Window; 


E, neste caso, a aparência principal final
então
 [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
Graças ao # chat em tg e ao usuário Yuri .

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


All Articles