|
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 |
|
|
start [/forum/topic.php?fid=21&msg=39589868&tid=1440452]: |
0ms |
get settings: |
10ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
171ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
60ms |
get tp. blocked users: |
2ms |
others: | 233ms |
total: | 512ms |
0 / 0 |