Регулярная Авалония

Иногда мы не понимаем как работает регулярное выражение, которое мы составили, и хотим проверить. Есть множество восхитительных приложений встроенных в различные среды или онлайн. Мне захотелось добавить еще одно к этому списку.
В данной статье мы посмотрим, как можно обернуть Regex в кроссплатформенную графику и получить простенькое приложение для теста регулярных выражений.
yvpcf30pr2isohyp1d7h95qw870.png

Начало


Для того, чтобы создать проект с использованием avalonia ui нужно установить шаблоны с GitHub.
И создать проект из шаблона mvvm.

dotnet new avalonia.mvvm -o MyApp

Дизайн и разметка


Для создания основного окна разместим все компоненты внутри грида.

 
        
            
            
            
            
            
        
    


Наше приложение состоит из 2‑х частей: верхнего аналога тулбара и рабочей области.
1nqverj1d4ib5wthe7lomyxbc30.png

Рассмотрим верхнюю часть


Тут у нас поле для ввода регулярного выражения, чекбокс, показывающий, как анализировать текст (построчно или как целый фрагмент) и кнопка справки.
В качестве контейнера выступает Док панель. Данный контрол позволяет легко заполнить контейнер элементами, прижимая их к разным сторонам и гарантируя отсутствие свободного места внутри.

 


И заполняем ее полем для ввода текста:

 


Здесь стоит отметить приятную мелочь для Avalonia ui — наличие watermark у текстовых полей.
Добавим на панель чекбокс, имеющий 2 состояния, о чем говорит IsThreeState=«False»:

 


И кнопку, отвечающую за вызов справки:

 


Основная часть
Рабочая часть будет помещена в грид:

 
            
                
                
                
            
        


Поле ввода представлено текст боксом:

 


Сплиттер позволяет подобрать удобную визуализацию под свои нужды:

  


А поле, отвечающее за отображение результата применения регулярных выражений поместим в бордер так как текст блок не обладает собственной рамкой:

  
                
            

Окно справки
5ck6m5nboedgw_2_iaun3lutqiu.png
для создания нового окна обратимся к терминалу

dotnet new avalonia.window -na MyApp -n MyNewWindow


Данное окно будет содержать лишь справочную информацию и больше ничего, так что, проигнорировав контейнеры, сделаем лист бокс дочерним элементом для данного окна:

 
 


И заполним его одинаковыми элементами по мере необходимости:

     
            
                
                
            
        


Разметка достаточно простая: стек панель с 2 полями, единственное что здесь стоит отметить — атрибут Classes, что позволит стилизовать наши окна наподобие css (еще одна приятная фишка Авалонии.
И собственно покрасим сами правила в зеленый цвет:

 
        
    

Функциональность mvvm


В первую очередь озаботимся полями для всех элементов разметки:

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


Создадим методы, которые вернут результаты матчинга с исходным тесктом:

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


И с исходным текстом по линиям, для чего применим 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;
        }


И добавим метод, отображающий окно справки

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

Свойства и биндинги
Интересной особенностью Авалонии является возможность прибиндить метод напрямую к кнопке:


Чем мы и воспользуемся.
Для остальных полей мы просто прибиндимся к свойствам. Здесь также интересной особенностью является то, что в авалонии обновление привязки происходит при изменении содержимого контрола, что в впф делалось так: UpdateSourceTrigger=PropertyChanged в авалонии работает по умолчанию.
А так как шаблон mvvm авалонии связан с Reactive UI, то и свойства создаются с использованием данной библиотеки:

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


В заключение
Я надеюсь, что данная статья заинтересует не только тех, кто захочет использовать мой материал и\или как-то улучшить его, но и всех тех, кто знакомится с авалонией или ищет возможности создания кроссплатформенных приложений на c#.
Исходный код (тык).
Хотелось бы сказать спасибо ForNeVeRkekekeks worldbeater
И отметить, что поддержку по c# можно найти тут, а по авалонии вот тут.

© Habrahabr.ru