[C#] По пути в Авалонию
Автор
Сообщение
news_bot ®
Стаж: 6 лет 9 месяцев
Сообщений: 27286
Здравствуй дорогой наш читатель. Это третья статья из серии переезда нашего ПО на кроссплатформенные рельсы. Она затронет визуальную часть продукта, а именно диалоговое окно. В рамках первой статьи упоминалось, что данное приложение вызывается через пункт ПКМ, в связи с чем были проблемы при развертывании в разных ОС. Самое интересное заключалось не только в том, как реализовать вызов “визуальщины”, но и в том, как без сильных потерь реализовать диалоговое окно, которое мы сможем спокойно использовать в 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.Ссылки на использованные источники: Группа в Telegram - (AvaloniaUI (RU)) - https://t.me/AvaloniaRU Статьи на Хабре: https://habr.com/ru/post/438920/ https://habr.com/ru/company/skbkontur/blog/524518/ https://habr.com/ru/post/455896/ https://habr.com/ru/post/452818/
===========
Источник:
habr.com
===========
Похожие новости:
- [DIY или Сделай сам] Математика, красота, любовь — история одной валентинки
- [Разработка игр, C#, Unity] Стики и работа с Event System в Unity 3D
- [.NET, C#] Тестирование генератора исходного кода
- [.NET, C#, F#] Букварь по F# для любопытствующих C#-разработчиков (перевод)
- [Программирование, .NET, C#] Шпион под прикрытием: проверяем исходный код ILSpy с помощью PVS-Studio
- [Разработка игр, C#, Unity, Дизайн игр] Жидкий персонаж на Unity 3D
- [Программирование, .NET, C#] A Spy Undercover: PVS-Studio to Check ILSpy Source Code
- [C#, VueJS] Оптимизация страницы с использованием RxJS и Expression Tree
- [.NET, Разработка игр, C#] Бэк-офис для игр или «результат борьбы с пенсионной скукой»
- [Java, C#, Учебный процесс в IT, Карьера в IT-индустрии] Как стать разработчиком Java и С#: открываем онлайн-практикум с поддержкой менторов
Теги для поиска: #_c#, #_avalonia, #_crosstech, #_blog_kompanii_cross_technologies (
Блог компании Cross Technologies
), #_c#
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 22-Ноя 21:10
Часовой пояс: UTC + 5
Автор | Сообщение |
---|---|
news_bot ®
Стаж: 6 лет 9 месяцев |
|
Здравствуй дорогой наш читатель. Это третья статья из серии переезда нашего ПО на кроссплатформенные рельсы. Она затронет визуальную часть продукта, а именно диалоговое окно. В рамках первой статьи упоминалось, что данное приложение вызывается через пункт ПКМ, в связи с чем были проблемы при развертывании в разных ОС. Самое интересное заключалось не только в том, как реализовать вызов “визуальщины”, но и в том, как без сильных потерь реализовать диалоговое окно, которое мы сможем спокойно использовать в 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); 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.Ссылки на использованные источники: Группа в Telegram - (AvaloniaUI (RU)) - https://t.me/AvaloniaRU Статьи на Хабре: https://habr.com/ru/post/438920/ https://habr.com/ru/company/skbkontur/blog/524518/ https://habr.com/ru/post/455896/ https://habr.com/ru/post/452818/ =========== Источник: habr.com =========== Похожие новости:
Блог компании Cross Technologies ), #_c# |
|
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 22-Ноя 21:10
Часовой пояс: UTC + 5