|
0 / 0 / 0
Регистрация: 12.12.2021
Сообщений: 205
|
||||||||||||||||
ProgressBar в MVVM02.04.2022, 20:36. Показов 9547. Ответов 86
Метки нет (Все метки)
Здравствуйте! Помогите, пожалуйста, нужно сделать индикатор выполнения (ProgressBar) какого-либо процесса в MVVM в Авалонии. Правильно, ли я делаю?
0
|
||||||||||||||||
| 02.04.2022, 20:36 | |
|
Ответы с готовыми решениями:
86
ProgressBar в MVVM
Консольный progressbar или progressbar в TMemo |
|
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
|
||
| 05.04.2022, 12:19 | ||
|
Добавлено через 10 минут Элд Хасп, вообще, где-где, а в Avalonia я бы рекомендовал использовать именно реактивное программирование. Как бы сильно я не любил RelayCommand, но ReactiveCommand, всё таки, мне симпатизирует больше. Он объективно превосходит все реализации комманд, которые я вообще видел.
1
|
||
|
Модератор
|
||
| 05.04.2022, 12:42 | ||
|
Но вопрос в начале не затрагивал Avalonia и судя по нему ТС не потянет (с текущим уровнем) освоение реактивного программирования. Я как понял, он и командах-то первый раз сейчас только услышал.
0
|
||
|
0 / 0 / 0
Регистрация: 12.12.2021
Сообщений: 205
|
|
| 05.04.2022, 16:39 [ТС] | |
|
0
|
|
|
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
|
|
| 05.04.2022, 16:47 | |
|
Sun1212, я немного не в теме, но видел там ответы.
Вам нужно что-то объяснить, с чем-то помочь? Или тема закрыта? Соориентируйте, пожалуйста.
0
|
|
|
Модератор
|
||
| 05.04.2022, 18:24 | ||
|
Добавлено через 7 минут Sun1212, у меня Avalonia даже не запустилась - когда-то пытался. Поэтому могу ответить только по общим вопросам не специфичным для платформы. Avalonia, по моему, неотделима от ReaciveUI. Можно, конечно, его игнорировать и делать как на WPF, но, на мой взгляд, это бессмысленно. Раз уж взялись за освоение Avalonia, то лучше изучить реактивное программирование.
1
|
||
|
0 / 0 / 0
Регистрация: 12.12.2021
Сообщений: 205
|
||
| 05.04.2022, 19:15 [ТС] | ||
|
Я за основу взяла код из поста 6, прикрепляю свой проект.
0
|
||
|
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
|
|
| 05.04.2022, 19:27 | |
|
0
|
|
|
0 / 0 / 0
Регистрация: 12.12.2021
Сообщений: 205
|
|
| 05.04.2022, 19:31 [ТС] | |
|
limeniye, нет, надо именно в другом проекте. У меня в тесте в проекте Start кнопка, которая запустит проект Test_Progress.
За основу взяла код из поста 6, только кнопку перемещаю в другой проект
0
|
|
|
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
|
|||||||
| 05.04.2022, 19:42 | |||||||
|
Проект запускается при запуске приложения. Вы что-то путаете. При нажатии на кнопку Вы можете лишь запустить окно, которое находится в другой библиотеке. Писал "от руки" но +- вот так.
0
|
|||||||
|
0 / 0 / 0
Регистрация: 12.12.2021
Сообщений: 205
|
||
| 05.04.2022, 20:02 [ТС] | ||
|
0
|
||
|
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
|
|
| 06.04.2022, 01:05 | |
|
Sun1212, понял, хорошо. В течении нескольких часов дам ответ.
Добавлено через 4 часа 53 минуты Не по теме: Sun1212, в течении нескольких часов не успеваю, есть там один ступор у меня. Буду разбираться уже после сна.
0
|
|
|
0 / 0 / 0
Регистрация: 12.12.2021
Сообщений: 205
|
||
| 06.04.2022, 12:11 [ТС] | ||
|
0
|
||
| 06.04.2022, 12:45 | |
|
Не по теме: Я уже разобрался с ошибкой. Чуток занят просто. Постараюсь, как буду свободен, дописать. Там буквально пару строк осталось.
0
|
|
|
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 06.04.2022, 14:28 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Часть Первая
View По задаче у нас должно быть два проекта: Проект А -- главный View-проект. Проект B -- побочный. В главном будет кнопка "Start", в побочном -- окно с ProgressBar'ом. На "скорую руку" накидаю дизайн: MainWindow
ProgressWindow
Свойством Maximum мы задаём количество промежуточных делений. Я указал 100, так как в процентном соотношении это проще считать. Свойством Value, для теста, я указал "уже пройденный путь" (для теста). Model Супер! Теперь нам нужно чтобы была какая-то задача, которая выполнялась долго. Я буду создавать 70 пустых файлов с промежутком 0.3 секунды. Так как это уже какая-то "логика" программы, я создам для неё отдельный .Net 6 проект. Назову его "Model", чтобы было понятно, что это слой Model паттерна Model <--> ViewModel <--> View. Этот слой независим от Avalonia, там не должно быть реализаций INotifyPropertyChanged интерфейса. В нём создам класс FileManagerService, он у нас будет отвечать за создание файлов.
Получается 70 файлов будут создаваться 2.1 секунду (300мс * 70файлов / 1000мс). Супер, но теперь нам нужно оповещать программу каждый раз, когда мы создаём файл. Для оповещений используют события. То есть в программе что-то произошло -- нужно оповестить участки программы, которым нужна эта информация. Представим, что программа -- это торговый центр. Нам нужно оповестить детские отделения торгового центра о том, что торговый центр закрывается. delegate -- это тематика оповещения. То есть то, о чём мы будем оповещать программу. Если взять пример с торговым центром, то это ТЕМА о закрытии какого-то отдела; event -- это мы просто создаём таким образом сам "оповещатор", если его так можно назвать. Это наш микрофон, в который мы будем говорить; .Invoke() -- тут мы оповещаем наши детские отделения о том, что торговый цент закрывается, а в скобочках мы указываем в котором часу именно он закрывается, например. Теперь к практике:
FileCreatingProcessEventArgs -- это просто название события и его параметры. В качестве параметров я указал: fileIndex -- какой по счёту файл создался; filesCount -- сколько всего файлов. То есть каждый раз, когда будет создаваться файл, программа будет уведомлять нужные нам в ней места о том, что создался, например, 5ый файл из 70.
Этим и будет заниматься наша ViewModel. ViewModel Слой ViewModel'и паттерна Model <--> ViewModel <--> View будет "слушать" что ей говорит Model и передавать эту информацию к View. Выглядит это примерно так: - создался файл; - Model говорит "я создала файл 15ый из 70"; - ViewModel это услышала, обработала и оповестила об этом View; - View узнала, что уже не 20% файлов создалось, а уже 21.4% -- и обновила информацию на ProgressBar'е. Откуда взялись числа 20% и 21.4% -- это уже уровень ViewModel должен перевести 15 файлов из 70 в проценты. То есть 100%/70*15 = 21.4%
FileCreated?.Invoke(i, count);, то во ViewModel приходит эта информация (и для теста отображается в окне вывода).View + ViewModel Теперь нужно нажать на кнопку "Start" и запустить в model метод CreateFiles. Чтобы не нарушать паттерн MVVM мы не будем задавать кнопке имя x:Name="button" или создавать обработчик нажатия по типу Button_Clicked.Для этого используют привязки команды. В классе FileManagerViewModel создаю команду, которая запускает метод CreateFiles в моделе.
Оказывается, просто так использовать Реактивное программирование, вместе с Avalonia, нельзя. Его нужно ещё подключить. Для начала нужно установить два нугета для проекта A -- ReactiveUI и Avalonia.ReactiveUI Потом переходит в файл Program.cs и в методе BuildAvaloniaApp
Я это сделаю самым простым способом: просто задам DataContext главному окну.
1. Мы нажали на кнопку, которая волняет команду в вью-моделе; 2. Команда запускает метод CreateFiles в моделе; 3. Метод, после каждого создания файла оповещает об этом (в этой строке - FileCreated?.Invoke(i, count););4. Вью-модель "слушает" оповещения модели, благодаря "+=" ( в простонародье это называет подписка ); 5. И когда приходит оповещение, запускается Debug.WriteLine("Создано " + ...);, которое выводит всё в окно вывода.Выглядит это вот так:
2
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
|
|||||||||||||||||||||||||||||||||||||||||
| 06.04.2022, 15:13 | |||||||||||||||||||||||||||||||||||||||||
Сообщение было отмечено Sun1212 как решение
Решение
Часть вторая
Теперь у нас есть данные, осталось их просто выводить не в окно вывода, а в прогресс бар. Для этого я немного изменю код. Для удобства я модель сделаю статической: Кликните здесь для просмотра всего текста
Скопирую файл FileManagerViewModel в проект B. Теперь в проекта А я этот файл я изменю и уберу оттуда всё лишнее, а также переименую его на MainWindowViewModel:
Так как модель теперь у нас статическая, то класс FileManagerViewModel, который теперь находится в проекте B, не нуждается в её инициализации и строки можно упростить.
Нужно не забыть подвязать теперь эту ViewModel к DataContext'у ProgressWindow
Часть третья Осталось лишь подвязать сам ProcessWindow к каким-то значениям
2
|
|||||||||||||||||||||||||||||||||||||||||
|
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
|
|
| 06.04.2022, 15:30 | |
|
2
|
|
|
0 / 0 / 0
Регистрация: 12.12.2021
Сообщений: 205
|
|
| 06.04.2022, 17:29 [ТС] | |
|
limeniye, спасибо огромное!!! Буду разбираться!
Добавлено через 2 минуты limeniye, Благодарю за подробное объяснение!!!
0
|
|
| 06.04.2022, 17:30 | |
|
Не по теме: Sun1212, любые вопросы — не стесняйтесь. При возможности постараюсь ответить.
0
|
|
|
0 / 0 / 0
Регистрация: 12.12.2021
Сообщений: 205
|
|||||||||||
| 06.04.2022, 19:16 [ТС] | |||||||||||
|
limeniye, Подскажите, пожалуйста, в проекте В в ProgressWindow можно записать так:
у вас в коде
У меня пока ProgressBar не отображается при нажатии на кнопку...
0
|
|||||||||||
|
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
|
||||||||||||
| 06.04.2022, 19:25 | ||||||||||||
|
Sun1212, Вы можете изменить, но в таком случае Вам нужно будет изменить namespace в ProgressWindow.xaml.cs файле.
У меня там
Sun1212, не отображается ProgessBar, или не отображается окно? Добавлено через 3 минуты
1
|
||||||||||||
| 06.04.2022, 19:25 | |
|
Mvvm
MVVM Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала.
Ниже прикреплён. . .
|
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F
Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU.
Опрашиваются регистры. . .
|
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка:
Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
|
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо
Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
|
|
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман.
Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
|
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
|
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
|
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ
Основная суть и тезисы по измерениям:
0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема.
Объект не может перемещаться в 0D.
1D (Первое измерение):. . .
|