Русский
Русский
English
Статистика
Реклама

По пути в Авалонию

Здравствуй дорогой наш читатель. Это третья статья из серии переезда нашего ПО на кроссплатформенные рельсы. Она затронет визуальную часть продукта, а именно диалоговое окно.

В рамках первой статьи упоминалось, что данное приложение вызывается через пункт ПКМ, в связи с чем были проблемы при развертывании в разных ОС. Самое интересное заключалось не только в том, как реализовать вызов визуальщины, но и в том, как без сильных потерь реализовать диалоговое окно, которое мы сможем спокойно использовать в Linux, а возможно в дальнейшем и в Windows. Для самых нетерпеливых забежим вперёд и скажем, что в данной задаче нам помог framework Avalonia. Ну, а теперь, по порядку.

Мы имеем WinForms приложение, работающее, разумеется, только в Windows. Его задача - выводить диалоговое окно с небольшим количеством контролов, фактически, главными из которых являются листбокс и кнопка.

Как раз только выходит .Net Core 3, с предположением о работе в Linux. Собираем, проверяем и ничего не получаем. В действительности в Linux не добавили визуальную часть. Ну что же, ищем другие варианты.

Самым часто встречающимся фреймворком по данному вопросу является Avalonia. Мы решили опробовать её. Взяли простейший пример, собрали в Linux, запустили и - да, диалоговое оно отобразилось. Теперь дело за малым - перенести WinForms проект на Avalonia.

В качестве проекта был выбран простой шаблон Avalonia Application. При условии, что логика и DTO уже вынесены в отдельные библиотеки, шаблон MVVM здесь был бы избыточен.

Перенос дизайна основного окна с WinForms на XAML прошёл без проблем, несмотря на то, что разработчик в знакомстве с WPF ранее замечен не был.

Логика осталась практически без изменений (BackgroundWorker, файлы, DTO...).

Реализация окон сообщений, на первый взгляд, также проблем не вызвала.

В проекте WinForms в качестве диалогового окна сообщения использовался System.Windows.Forms.MessageBox.

MessageBox.Show("Метка установлена", "Crosstech DSS",                 MessageBoxButtons.OK, MessageBoxIcon.Information);

Для нового проекта можно было использовать окно, производное от Avalonia.Controls.Window, предварительно оформленное как окно сообщения с иконками, текстом, стилями и кнопками, но...

в процессе изучения форумов выяснилось, что за нас уже подумали:). Существует проект MessageBox.Avalonia с иконками и вот этим вот всем. Проект немедленно был установлен.

Сначала это выглядело так:

private void Form_Load(object sender, EventArgs e){  ...    _backgroundWorker.DoWork += DoLoadForm;    _backgroundWorker.RunWorkerAsync();...}private void DoLoadForm(object sender, DoWorkEventArgs e){...MessageBoxHelper.ShowErrorBox("Нет разрешённых действий для данного документа. Пожалуйста, обратитесь к администратору.");...}internal static class MessageBoxHelper{  public static async void ShowBox(MessageBoxStandardParams MBSparams)    {    Action showMSBDialog = () => MessageBox.Avalonia.MessageBoxManager.GetMessageBoxStandardWindow(MBSparams).ShowDialog(new MainWindow());      await Dispatcher.UIThread.InvokeAsync(showMSBDialog);    }public static void ShowErrorBox(string message)    {    var MBSparams = new MessageBoxStandardParams      {      ButtonDefinitions = ButtonEnum.Ok,        ContentTitle = $"Ошибка доступа",        ShowInCenter = true,        ContentMessage = message,        Icon = MessageBox.Avalonia.Enums.Icon.Error,        Style = Style.Windows      };      ShowBox(MBSparams);    }...}

Окно сообщения всё-таки выводилось на экран. Для начала неплохо. Проблема была в том, что это окно сообщения существовало независимо от главного окна приложения, они все были доступны и закрывать их можно было в любом порядке, результат диалога не анализировался. Такое положение вещей нас более не устраивало, внесли небольшие изменения, на данном этапе получилось так:

private async void DoLoadForm(object sender, DoWorkEventArgs e){var rezult = await MessageBoxHelper.ShowErrorBox("Нет разрешённых действий для данного документа. Завершить работу с документом?", this);  if (rezult == MessageBox.Avalonia.Enums.ButtonResult.Yes)  {  Environment.Exit(0);  }...}internal static class MessageBoxHelper{public static async Task<ButtonResult> ShowBox(MessageBoxStandardParams MBSparams, Window owner = null)  {if (owner == null){owner = new MainWindow();}Func<Task<ButtonResult>> www = new Func<Task<ButtonResult>>(() => MessageBox.Avalonia.MessageBoxManager.GetMessageBoxStandardWindow(MBSparams).ShowDialog(owner));ButtonResult result = await Dispatcher.UIThread.InvokeAsync(www);return result;}public static async Task<ButtonResult> ShowErrorBox(string message, Window owner = null)  {  var MBSparams = new MessageBoxStandardParams    {    ButtonDefinitions = ButtonEnum.YesNo,      ContentTitle = $"Ошибка доступа",      ShowInCenter = true,      ContentMessage = message,      Icon = MessageBox.Avalonia.Enums.Icon.Error,      Style = Style.Windows     };     return await ShowBox(MBSparams, owner);   } ...}

Диалоговое окно выводится на переднем плане, не даёт переключить фокус на основное окно, возвращает результат. Уже лучше.

В процессе тестирования столкнулись с багом: на Windows 8 x86 при включенном масштабировании, наше окно отображается с чёрной рамкой. Меняли большинство параметров отображения в XAML, не помогло.

Хотим отдельно отметить прекрасную поддержку проекта Avalonia.

Ссылки на использованные источники:

Статьи на Хабре:

Источник: habr.com
К списку статей
Опубликовано: 15.02.2021 12:06:03
0

Сейчас читают

Комментариев (0)
Имя
Электронная почта

Блог компании cross technologies

C

Avalonia

Crosstech

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru