Avalonia первая встреча

Когда мы встречаем новый язык, мы пишем «Hello word», а когда встречаем новый UI, то создаем блокнот. Здесь же я хочу показать простейший пример дружбы с корссплатформенным GUI Framework AvaloniaUI.
_lqs0rpahrgu43pa5mbzlikukoo.pngluvgvuabjqmsafpvy5hbx8_fye0.png

В первую очередь установим необходимый шаблон.
Для этого сохраняем этот репозиторий на свой машине.
Открываем консоль и пишем:

dotnet new --install [путь до скачанного шаблона]


И создадим стартовый проект:

dotnet new avalonia.mvvm -o Notebook


Добавим простенькую разметку как в wpf в файле MainWindow.xaml.


    
    
        
        
    
    
        
    
    
    
        
            
            
        
        
            
        
        
        
            
                
                
            
        
        
        
    

C mvvm тут все чуть по-другому, так как по дефолту используется ReactiveUI.
Так что в файле MainWindowViewModel.cs добавим:

 private string _data;

        public string Data
        {
            get => _data;
            set => this.RaiseAndSetIfChanged(ref _data, value);
        }

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

 public async Task Open()
        {
            var dialog = new OpenFileDialog();
            string[] result = null;
            dialog.Filters.Add(new FileDialogFilter() {Name = "Text", Extensions = {"txt"}});
            result = await dialog.ShowAsync();
            if (result != null)
            {
                Data = File.ReadAllText(result.First());
            }
        }


А вот так сохранение:

 public async Task Save()
        {
            var dialog = new SaveFileDialog();
            dialog.Filters.Add(new FileDialogFilter() 
         
            {Name = "Text", Extensions = {"txt"}});
            var result = await dialog.ShowAsync(new MainWindow());
            if (result != null)
            {
                File.WriteAllText(result, Data);
            }
        }


Для того, что бы приложение запускалось на Линуксе придется добавить еще одну зависимость: Avalonia.Skia.Linux.Natives.
Но к сожалению не все сборки смогут отобразить наше окно. Ubuntu (в том числе и Mate) отлично справляется как на большой (x64) архитектуре, так и на arm, а вот Raspbian явно подводит.
jznfdm07lzdnn6y9cali1knob6e.png
P.S.
Проект безумно интересный и приятный. Имеет очень много таргетных платформ в том числе и яблочных, надеемся, что скоро он будет отлично работать на всех платформах.

© Habrahabr.ru