|
ProgressBar в отдельном окне
|
|||
---|---|---|---|
#18+
Наверняка гуру это делали лет дцать назад, может быть вспомните и подскажите как реализовать такое (WPF, придерживаясь MVVM): есть у меня N кнопок в основном окне, для каждой есть команда во ViewModel, в которой выполняется длительная операция: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
Мне нужно по нажатию на кнопку перед запуском этих операций вывести отдельное окно и там вывести ProgressBar с итерациями. Я сталкивался раньше на WinForms с тем, что там ГУИ было в том же окне. Так же читал, что тот же BackgroundWorker вроде как уже устарел и для WPF можно реализовать задуманное проще. А даже если и не устарел, то как его прикрутить для другого окна? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2018, 10:03 |
|
ProgressBar в отдельном окне
|
|||
---|---|---|---|
#18+
Qwe.Qwe1, Алтернативы интересны? Прогресс в панели задач винды. Пару строк Код: c# 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2018, 10:25 |
|
ProgressBar в отдельном окне
|
|||
---|---|---|---|
#18+
Скорее это интересно в дополнение, но все равно спасибо) ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2018, 11:10 |
|
ProgressBar в отдельном окне
|
|||
---|---|---|---|
#18+
Qwe.Qwe1, Диалоговые и т.д. окна не делаются по MVVM imho. Значит, все как обычно. Отдельное окно и события туда сюда на делегатах (как вариант). ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2018, 11:28 |
|
ProgressBar в отдельном окне
|
|||
---|---|---|---|
#18+
Qwe.Qwe1, И в wpf и в winforms вы можете делать либо в отдельном, либо в том же. Это чисто дизайн. По потокам, в 4.5 появился async ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2018, 11:34 |
|
ProgressBar в отдельном окне
|
|||
---|---|---|---|
#18+
Ну я создал окно "WaitWindow" и в XAML-разметке обозначил Прогресс-бар, текст "Ждите.." и т.д. Для этого окошка я могу не использовать MVVM, ладно уж..) Теперь надо как-то его отобразить и управлять потоком и прогресс-баром без велосипеда) ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2018, 11:39 |
|
ProgressBar в отдельном окне
|
|||
---|---|---|---|
#18+
Petro123Qwe.Qwe1, Диалоговые и т.д. окна не делаются по MVVM imho. Значит, все как обычно. Отдельное окно и события туда сюда на делегатах (как вариант). Окна очень даже прекрасно делаются по MVVM - инжектируются в модель как сервис. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2018, 11:55 |
|
ProgressBar в отдельном окне
|
|||
---|---|---|---|
#18+
Сон Веры Павловныинжектируютсяесли без DI то интересно глянуть ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2018, 12:00 |
|
ProgressBar в отдельном окне
|
|||
---|---|---|---|
#18+
Qwe.Qwe1, Вы потоки сначала сделайте. Они же ниже view ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2018, 12:02 |
|
ProgressBar в отдельном окне
|
|||
---|---|---|---|
#18+
Это только пример, а не код для продакшена, много чего нет, так как всё написано с нуля на коленке. Класс WindowManager является промежуточным, между View и ViewModel и лучше его размещать в отдельной сборке, если сборки View и ViewModel разнесены. Пример сделан, примерно так, как я люблю реализовывать работу с окнами, по этому не пинайте сильно. Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. 156. 157. 158. 159. 160. 161. 162. 163. 164. 165. 166. 167. 168. 169. 170. 171. 172. 173. 174. 175. 176. 177. 178. 179. 180. 181. 182. 183. 184. 185. 186. 187. 188. 189. 190. 191. 192. 193. 194. 195. 196. 197. 198. 199. 200. 201. 202. 203. 204. 205. 206.
Код: xml 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43.
... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2018, 12:10 |
|
ProgressBar в отдельном окне
|
|||
---|---|---|---|
#18+
ну и забыл сказать, я всё упаковал в 2 файла, ни какого другого кода в примере нет ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2018, 12:11 |
|
ProgressBar в отдельном окне
|
|||
---|---|---|---|
#18+
Roman Mejtes, Менеджер для всех это круто. Аффтар! У вас выбор, одна, 10 или 300 строк. Дерзайте. Удачи! ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2018, 12:21 |
|
ProgressBar в отдельном окне
|
|||
---|---|---|---|
#18+
Petro123Сон Веры Павловныинжектируютсяесли без DI то интересно глянуть Если что, инжект сервиса можно делать без использования DI-фреймворков и паттернов а-ля service locator - собственно, суть DI заключается не в использовании фреймворков, а в развязке зависимостей через интерфейсы. Ваш К.О. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2018, 13:31 |
|
ProgressBar в отдельном окне
|
|||
---|---|---|---|
#18+
Сон Веры Павловны, Ну я просто не видел такой вариант. Везде что видел это инжектируемые поля в классе и конфиг с временем жизни. Я пока ручками и ни сколько не критикую. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2018, 13:36 |
|
ProgressBar в отдельном окне
|
|||
---|---|---|---|
#18+
service locator это анти-паттерн по сути и он может сильно запутывать, особенно если есть несколько реализаций одного сервиса ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2018, 13:57 |
|
ProgressBar в отдельном окне
|
|||
---|---|---|---|
#18+
Roman Mejtes, как всегда круто) Буду пробовать пойти предложенным путем. А можно таки упростить все и обойтись без "public static class WindowManager"? Прямо окно с прогресс-баром заточить на свой шаблон и прочее, без такой вот универсальности? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2018, 14:43 |
|
ProgressBar в отдельном окне
|
|||
---|---|---|---|
#18+
Qwe.Qwe1Roman Mejtes, как всегда круто) Буду пробовать пойти предложенным путем. А можно таки упростить все и обойтись без "public static class WindowManager"? Прямо окно с прогресс-баром заточить на свой шаблон и прочее, без такой вот универсальности?это типа: а можно mvvm, но без буквочек vv? )) ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2018, 15:08 |
|
ProgressBar в отдельном окне
|
|||
---|---|---|---|
#18+
конечно можно, можно и через Content делать окно, а потом просто открыть его из модели. Это несколько нарушает правила шаблона о том, что модель представления не знает о самом представлении, но можно и не следовать этому правилу. В 1 из проектов поверх WindowManager у меня еще был LayoutManager который отвечал за работу вкладок (табов) в окнах, возможность перекидывания вкладок из окна в окно, и т.д. Так же WM отвечал за MessageBox'ы из VM, за возможность открытия, закрытия окон, за проброс маршрутизируемых команд из диалоговых окон в вызывающие, следил из иерархией окон, предоставлял всякие другие механизмы взаимодействия между окнами, при этом выше упомянутое правило соблюдается. Ведь создавай модель и вызывая команду на открытия окна для этой модели я не указываю ни каких типов из View, они будет разрешаться автоматически на основе имеющихся стилей. Есть куча примеров как взаимодействовать с окнами из VM, гуглите, это просто тот вариант, который использую я, не знаю, есть ли аналогичные в интернете ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2018, 15:08 |
|
ProgressBar в отдельном окне
|
|||
---|---|---|---|
#18+
Qwe.Qwe1, Получается вам нужно начать с делегата. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2018, 15:09 |
|
ProgressBar в отдельном окне
|
|||
---|---|---|---|
#18+
Roman Mejtesможно и через Content делать окно, а потом просто открыть его из модели.вот этот наверно.... пару фраз буквально. Интересно. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2018, 15:13 |
|
ProgressBar в отдельном окне
|
|||
---|---|---|---|
#18+
Petro123, каких фраз? Окно наследует элемент управления ContentControl. У ContentControl'а есть свойств Content. Свойство хитрое тем, что в зависимости от содержимого оно будет обрабатываться по разному Eсли мы задаем этому свойству в качестве значения объект унаследованный от UIElement (другой элемент управления), то оно будет отображать его как своё содержимое. Такой подход использует в стандартном варианте. Когда вы создаете окно, его свойством по умолчанию является свойство Content. Код: xml 1. 2. 3.
равносильно: Код: c# 1.
Но если в Content передать объект наследованный не от UIElement, то для его визуализации будет использовать шаблон данных заданный в свойстве ContentTemplate или полученный из ContentTemplateSelector'а В примере выше, окно ProgressBar'а использует 2ой метод, а главное окно 1ый. У обоих есть свои плюсы и минусы, а иногда стоит их комбинировать, что недостатков не было :) ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2018, 15:36 |
|
ProgressBar в отдельном окне
|
|||
---|---|---|---|
#18+
Roman Mejtesкаких фраз?развить вашу мысль в пару фраз имел ввиду. Т.к. контекст понимаю для биндинга. Для прогрессбара не понимаю imho. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2018, 16:02 |
|
ProgressBar в отдельном окне
|
|||
---|---|---|---|
#18+
Petro123, Context!=Content ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2018, 16:11 |
|
ProgressBar в отдельном окне
|
|||
---|---|---|---|
#18+
А как в LongOperation, помимо итерации прогресса, можно передать произвольный текст в диалоговое окно, который бы отображался рядом с прогрессбаром: "Идет операция i" и т.п. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2018, 17:15 |
|
ProgressBar в отдельном окне
|
|||
---|---|---|---|
#18+
Qwe.Qwe1А как в LongOperation, помимо итерации прогресса, можно передать произвольный текст в диалоговое окно, который бы отображался рядом с прогрессбаром: "Идет операция i" и т.п. использовать в generic типа не double, а пользовательский класс Progress<double> -> Progress<FooClass> ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2018, 17:25 |
|
ProgressBar в отдельном окне
|
|||
---|---|---|---|
#18+
Ясно, спасибо. А по завершении LongOperation (то есть при завершении потока) ведь надо еще закрыть диалоговое окно с прогрессом? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2018, 21:22 |
|
ProgressBar в отдельном окне
|
|||
---|---|---|---|
#18+
Qwe.Qwe1Ясно, спасибо. А по завершении LongOperation (то есть при завершении потока) ведь надо еще закрыть диалоговое окно с прогрессом?наверное, я не знаю :) это же ваша программа, если там по мимо прогресс бара какие то логи отображаются, то скорее всего нужно позволить пользователю закрыть окно самостоятельно с кнопки, чтоб он имел возможность ознакомиться с результатами выполнения. я же написал, это просто пример реализации, написанный на коленке для автора за минут 20 ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2018, 22:40 |
|
ProgressBar в отдельном окне
|
|||
---|---|---|---|
#18+
Для прогресса использую такой класс: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90.
для многопоточности использую BackgroundWorker. Порядок действий сл.: - в конструкторе Window, где будет идти загрузка или обработка данных пишем LoaderManager.Init(this); - перед вызовом метода RunWorkerAsync класса BackgroundWorker пишем LoaderManager.Instance.ShowLoader(); - в DoWork делаем загрузку или обработку данных; - в RunWorkerCompleted делаем LoaderManager.Instance.HideLoader() ... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2018, 14:55 |
|
ProgressBar в отдельном окне
|
|||
---|---|---|---|
#18+
Супер_Пав, Тут ты в коде создаешь view контролы. Не всем нравится мешать логику и view ... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2018, 15:36 |
|
ProgressBar в отдельном окне
|
|||
---|---|---|---|
#18+
Petro123Супер_Пав, Тут ты в коде создаешь view контролы. Не всем нравится мешать логику и view Где мешается логика? Создаются контролы в конструкторе окна. Да, дальше из VM мы показываем и или прячем контролы. А показывать окна, т.е. то, о чем просит ТС - это не тоже самое? Хорошо, можно доработать немного класс, забиндить Visibility контрола на какое-нить свой-во VM. Доработки дальше - это уже дело вкуса. Я не сильно ломаю логику MVVM. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2018, 15:42 |
|
ProgressBar в отдельном окне
|
|||
---|---|---|---|
#18+
Супер_ПавСоздаются контролы в конструкторе окна.окно нужно видеть в дизайнере. Я про это. Оно видно? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2018, 16:06 |
|
ProgressBar в отдельном окне
|
|||
---|---|---|---|
#18+
Petro123Супер_ПавСоздаются контролы в конструкторе окна.окно нужно видеть в дизайнере. Я про это. Оно видно? что значит нужно? Зачем? А как же динамические формы, которые налету формируются? У меня есть проект, где формы формируются с контролами из XSLT. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2018, 16:38 |
|
ProgressBar в отдельном окне
|
|||
---|---|---|---|
#18+
Супер_Пав, Это имхо. Я не люблю динамику там где можно визуал верстка. Ширина = сколько? Не люблю))). Удачи! ... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2018, 16:44 |
|
ProgressBar в отдельном окне
|
|||
---|---|---|---|
#18+
Petro123Супер_ПавСоздаются контролы в конструкторе окна.окно нужно видеть в дизайнере. Я про это. Оно видно? Вообще не нужно. И часто - при более-менее сложном UI - просто невозможно. Даже если там контролы не создаются динамически. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2018, 16:44 |
|
ProgressBar в отдельном окне
|
|||
---|---|---|---|
#18+
Сон Веры Павловны, Когда то на андроид писал, так там гугл другого мнения. Сделал ide и рекомендовал проектировать визуально. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2018, 16:59 |
|
ProgressBar в отдельном окне
|
|||
---|---|---|---|
#18+
Petro123Супер_ПавСоздаются контролы в конструкторе окна.окно нужно видеть в дизайнере. Я про это. Оно видно?совсем не обязательно, лично я дизайнером не пользуюсь вообще, потому, что он медленный и бесполезный кусок :) но то, что описывать внешний вид, лучше в XAML это верно, кодить нужно поведение, модели и прочее, а внешний вид определять только в XAML. Тогда всё ясно и понятно, без лишних слов и внешний вид не привязан ко всему остальному. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2018, 19:54 |
|
ProgressBar в отдельном окне
|
|||
---|---|---|---|
#18+
Roman Mejtesсовсем не обязательно, лично я дизайнером не пользуюсь вообще, потому, что он медленный и бесполезный кусок :) ну, я и говорил, что есть винда и линукс. Есть люди визуально проектируют, а есть строят всякие генераторы(ГУИ с завязанными глазами) И это хорошо! )) ... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2018, 22:13 |
|
ProgressBar в отдельном окне
|
|||
---|---|---|---|
#18+
Petro123, Спецам уровня Романа вовсе не нужна внешняя визуализация. Известен факт/миф(?) что (во время обыска, дабы отвлечь внимание жандармов) дедушка Ленин "вслепую" (не видя шахматной доски) выиграл у жандарма-любителя. Т.е., у спецов своя "внутренняя" визуализация))) ... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2018, 22:23 |
|
ProgressBar в отдельном окне
|
|||
---|---|---|---|
#18+
LR, )) верю. Он крут. Но ты же знаешь, эти жандармы, тьфу - эти айтишники пускают наше ремесло на поток. Т.е. чтобы кОдило как больше студентов, а не уникумов). ... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2018, 22:58 |
|
ProgressBar в отдельном окне
|
|||
---|---|---|---|
#18+
Так по идеи можно все упростить и засунуть прогресс-бар в Popup-окно? Разметка будет в XAML'е, управление из основной View-модели.. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.01.2018, 12:29 |
|
ProgressBar в отдельном окне
|
|||
---|---|---|---|
#18+
Qwe.Qwe1, В какое папап окно? Обычное окно: MyWin.initialize; await длительная(.... MyWin.stop(); ... |
|||
:
Нравится:
Не нравится:
|
|||
26.01.2018, 13:45 |
|
|
start [/forum/topic.php?all=1&fid=21&tid=1440452]: |
0ms |
get settings: |
8ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
181ms |
get topic data: |
14ms |
get forum data: |
3ms |
get page messages: |
77ms |
get tp. blocked users: |
2ms |
others: | 14ms |
total: | 322ms |
0 / 0 |