AvaloniaUI: recursos no exemplo da MessageBox

O Avalonia ui é uma estrutura agradável para a qual você deseja voltar várias vezes. Então, voltemos a ele novamente e vejamos alguns recursos junto com minha caixa de mensagens.



Quem é Avalonia?


Avalonia é uma estrutura de plataforma cruzada que permite desenvolver interfaces gráficas em todas as plataformas relevantes.

Em sua estrutura, é incrivelmente próximo ao wpf: xaml semelhante, ligantes semelhantes. Existe até um tutorial oficial para desenvolvedores do wpf.

O Avalonia é notável pelo fato de que em cada um dos sistemas se refere às interfaces nativas: Win32, MonoMac, X11 ...

O que apareceu na versão atualizada
  1. Suporte 13 ícones de mensagens diferentes.
  2. Capacidade de copiar o corpo da mensagem usando a combinação de teclas Cntrl + C.
  3. Ajustando o tamanho da janela ao seu conteúdo.
  4. Um sistema de estilo simplificado que permite que aqueles que desejam ingressar facilmente no desenvolvimento e suporte de novos.
  5. Substituindo TextBlock por TextBox, agora o texto na janela pode ser selecionado.
  6. A arquitetura em si foi completamente redesenhada.



A documentação pode ser encontrada no gitlab .

O pacote em si pode ser baixado do nuget .

Vamos falar sobre os recursos e chips avalonia


Obviamente, se houver comparações, será comparado com o wpf.

A primeira coisa que chama sua atenção após as estruturas do ms é a capacidade de vincular comandos aos métodos. Sim, funcionalmente, isso oferece menos oportunidades, mas, em resposta, simplifica a abordagem para o desenvolvimento de um modelo de visualização.

<Button Command="{Binding RunTheThing}" CommandParameter="Hello World"> Do the thing! </Button> 

 public void RunTheThing(string parameter) { // Code for executing the command here. } 

O Avalonia também é construído usando extensões reativas, o que permite trabalhar com eventos da estrutura como objetos da primeira classe usando a sintaxe declarativa das consultas LINQ - permitindo escrever código conciso e legível.

Mas, indo um pouco mais fundo, tudo fica menos óbvio e a documentação ainda não foi trazida à mente (mas você pode ajudar).

Encadernação à imagem


O problema que encontrei quase imediatamente ao atualizar meu projeto foi como exibir imagens na minha janela.

Antes de tudo, é necessário registrar um diretório com imagens como um recurso do Avalonia, porque é importante que qualquer usuário exiba os ícones e os empacote convenientemente com todo o código.

  <ItemGroup> ... <AvaloniaResource Include="Assets\*" /> </ItemGroup> 

Agora, na etiqueta da imagem, você pode definir facilmente a imagem selecionada.

 <Image Source="/Assets/error.ico" /> 

Porém, ao usar o vm Source, as imagens não podem ser simplesmente anexadas a uma sequência, mas o Bitmap deve ser usado.

 <Image Source="{Binding ImagePath}" /> 

  public Bitmap ImagePath { get; private set; } 

E, portanto, agora precisamos extrair nossa imagem dos recursos. Por que usar o localizador Avalonia?

 ImagePath = new Bitmap(AvaloniaLocator.Current.GetService<IAssetLoader>() .Open(new Uri($" avares://ASSEMBLYNAME/relative/project/path/{ImageName}.ico"))); 

Vale notar que, para recursos incorporados ao compilar uri, o prefixo resm: // é usado e para avalonia - avares: // .

Desenhando


As formas em avalonia e wpf são semelhantes, mas as propriedades públicas são diferentes. Portanto, baixando imagens svg e convertendo-as usando mskam para ms xaml, elas não puderam ser usadas imediatamente.

Figura personalizada

 <PathGeometry Figures="M30 53 C15.641 53 4 41.359 4 27S15.641 1 30 1s26 11.641 26 26c0 7.135-2.874 13.599-7.528 18.297" FillRule="NonZero"/> 

Se transforma em:

 <GeometryDrawing Brush="#FF50C8EF" Geometry="M30 53 C15.641 53 4 41.359 4 27S15.641 1 30 1s26 11.641 26 26c0 7.135-2.874 13.599-7.528 18.297" /> 

Uma linha:

 <Line X1="25" Y1="37" X2="25" Y2="39" StrokeThickness="2" Stroke="#FFFFFFFF" StrokeMiterLimit="10" StrokeStartLineCap="Round" StrokeEndLineCap="Round"/> 

Se transforma em:

 <Line StartPoint="25,37" EndPoint="25,39" StrokeThickness="2" Stroke="#FFFFFFFF" StrokeStartLineCap="Round" StrokeEndLineCap="Round"/> 

Estilos


Sobre os estilos propriamente ditos, é dito na documentação . Vale a pena notar que esses são estilos familiares com um pouco de css. Eu queria mostrar como aplicar o estilo de um arquivo separado. Primeiro, todos os arquivos xaml devem ser recursos de avalonia.

 <ItemGroup> <AvaloniaResource Include="**\*.xaml"> <SubType>Designer</SubType> </AvaloniaResource> ..... </ItemGroup> 

Em segundo lugar, os estilos são aplicados da mesma maneira que os recursos de imagem usando uri e localizador.

 YourControl.Styles.Add(new StyleInclude(new Uri("avares://ASSEMBLYNAME/relative/project/path.xaml")){Source = new Uri("avares://ASSEMBLYNAME/relative/project/path.xaml")}); 

Nice little things


TextBox tem a propriedade Watermark. Isso permite que você não procure pacotes de terceiros e não bloqueie o TextBlock sobre o TextBox, que pode ser lido em muitos tutoriais do wpf.

 <TextBox Watermark="Street address" /> 

E também todos os binders usam PropertyChanged por padrão para acionar a atualização de uma propriedade relacionada.

Em conclusão


Sugiro a todos que experimentem esse quadro interessante. Obrigado aos usuários de Artyom Gorchakov e Nikita Tsukanov .

E lembro que a avalonia tem um apoio acolhedor e surpreendente na Gitter .

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


All Articles