Avalonia regular

A veces no entendemos cómo funciona la expresión regular que inventamos, y queremos verificar. Hay muchas aplicaciones interesantes integradas en diversos entornos o en línea. Quería agregar uno más a esta lista.

En este artículo, veremos cómo puede envolver Regex en gráficos multiplataforma y obtener una aplicación simple para probar expresiones regulares.



Inicio


Para crear un proyecto usando avalonia ui, necesita instalar plantillas desde GitHub .
Y cree un proyecto desde la plantilla mvvm.

dotnet new avalonia.mvvm -o MyApp 

Diseño y maquetación


Para crear la ventana principal, coloque todos los componentes dentro de la cuadrícula.

  <Grid> <Grid.RowDefinitions> <RowDefinition Height="5" /> <RowDefinition Height="Auto" /> <RowDefinition Height="5" /> <RowDefinition Height="*" /> <RowDefinition Height="5" /> </Grid.RowDefinitions> </Grid> 

Nuestra aplicación consta de 2 partes: el análogo superior de la barra de herramientas y el espacio de trabajo.



Considera la parte superior


Aquí tenemos un campo para ingresar una expresión regular, una casilla de verificación que muestra cómo analizar el texto (línea por línea o como un fragmento completo) y un botón de ayuda.

El contenedor es el panel Dock. Este control le permite llenar fácilmente el contenedor con elementos, presionándolos a diferentes lados y asegurando que no haya espacio libre en el interior.

  <DockPanel Grid.Row="1"> 

Y llénalo con un campo de entrada de texto:

  <TextBox Margin="5, 0, 5, 0" Watermark="Your regexp" AcceptsReturn="False" Text="{Binding RegText}"/> 

Aquí vale la pena señalar un poco agradable para Avalonia ui: la presencia de una marca de agua en los campos de texto.

Agregue una casilla de verificación con 2 estados al panel, como dice IsThreeState = "False" :

  <CheckBox DockPanel.Dock="Right" Content="By row" IsThreeState="False" IsChecked="{Binding IsChecked}" ToolTip.Tip="Check for each row" /> 

Y el botón responsable de llamar a la ayuda:

  <Button DockPanel.Dock="Right" Content=" ? " Margin="5, 0, 5, 0" ToolTip.Tip="Show hints" Command="{Binding ShowHelp}" /> 

Cuerpo principal

La parte de trabajo se colocará en la cuadrícula:

  <Grid Grid.Row="3"> <Grid.ColumnDefinitions> <ColumnDefinition Width="*" /> <ColumnDefinition Width="Auto" /> <ColumnDefinition Width="0.75*" /> </Grid.ColumnDefinitions> </Grid> 

El campo de entrada está representado por el cuadro de texto:

  <TextBox Grid.Column="0" AcceptsReturn="True" ScrollViewer.VerticalScrollBarVisibility="Auto" Text="{Binding InputText}"/> 

El divisor le permite elegir una visualización conveniente para sus necesidades:

  <GridSplitter Grid.Column="1" /> 

Y el campo responsable de mostrar el resultado de aplicar expresiones regulares se coloca en el borde porque el bloque de texto no tiene su propio marco:

  <Border BorderBrush="Gray" BorderThickness="1" Grid.Column="2"> <TextBlock ScrollViewer.VerticalScrollBarVisibility="Auto" Text="{Binding OutputText}" /> </Border> 

Ventana de ayuda



para crear una nueva ventana, pasemos a la terminal

 dotnet new avalonia.window -na MyApp -n MyNewWindow 

Esta ventana contendrá solo información de referencia y nada más, así que, ignorando los contenedores, haga que la hoja de la caja sea hija de esta ventana:

  <ListBox ScrollViewer.VerticalScrollBarVisibility="Visible" VirtualizationMode="None"> </ListBox> 

Y llénalo con los mismos elementos según sea necesario:

  <ListBoxItem> <StackPanel Orientation="Horizontal"> <TextBlock Margin="5" Text="A single character of: a, b or c" /> <TextBlock Margin="5" Classes="green" Text="[abc]" /> </StackPanel> </ListBoxItem> 

El diseño es bastante simple: un panel de pila con 2 campos, lo único que vale la pena señalar aquí es el atributo Clases , que nos permite diseñar nuestras ventanas como css (otra buena característica de Avalonia.

Y en realidad pinta las reglas en verde:

  <Window.Styles> <Style Selector="TextBlock.green"> <Setter Property="Foreground" Value="Green" /> </Style> </Window.Styles> 

Funcionalidad Mvvm


En primer lugar, cuidemos los campos de todos los elementos de marcado:

 private bool _isChecked; private string _inputText; private string _regText; private string _outputText; 

Cree métodos que devolverán los resultados del partido con el texto original:

 private void SetNoRowResult() { OutputText = string.Join(Environment.NewLine,new Regex(_regText).Matches(_inputText)); } 

Y con el texto fuente a lo largo de las líneas, para lo cual usamos Split
  private void SetRowResult() { var r = new Regex(_regText); var s = string.Empty; foreach (var line in _inputText.Split( Environment.NewLine,StringSplitOptions.RemoveEmptyEntries)) { s += $"--{Environment.NewLine}"; s+=string.Join(Environment.NewLine,r.Matches(line)); s += $"{Environment.NewLine}--{Environment.NewLine}"; } OutputText = s; } 

Y agregue un método que muestre la ventana de ayuda

 public void ShowHelp() { new HelpWindow().Show(); } 

Propiedades y enlaces

Una característica interesante de Avalonia es la capacidad de adjuntar un método directamente a un botón:

 <Button Command="{Binding ShowHelp}" /> 

Que usaremos.

Para el resto de los campos, solo nos unimos a las propiedades. Una característica interesante aquí es que en avalonia, la actualización de enlace se produce cuando el contenido del control cambia, lo que se hizo en vpf: UpdateSourceTrigger = PropertyChanged en avalonia funciona de manera predeterminada.

Y dado que la plantilla mvvm de Avalonia está asociada con la IU reactiva, las propiedades se crean con esta biblioteca:

 public string RegText { get => _regText; set { this.RaiseAndSetIfChanged(ref _regText, value); if(_isChecked) SetRowResult(); else SetNoRowResult(); } } 

En conclusión

Espero que este artículo sea de interés no solo para aquellos que desean utilizar mi material y / o mejorarlo de alguna manera, sino también para todos aquellos que están familiarizados con Avalonia o están buscando formas de crear aplicaciones multiplataforma en c #.

Código fuente ( tyk ).

Me gustaría dar las gracias a ForNeVer kekekeks worldbeater
Y tenga en cuenta que el soporte para c # se puede encontrar aquí , y para Avalonia aquí .

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


All Articles