powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / WPF: Как правильно дождаться обновления визуального дерева?
25 сообщений из 45, страница 1 из 2
WPF: Как правильно дождаться обновления визуального дерева?
    #39602263
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Смысл в чем - я делаю некоторое действие, которое повлияет на отображение, то есть изменится визуальное дерево.
Действие делаю в потоке пользовательского интерфейса.
WPF откладывает обновление визуального дерева, пока мой поток что-то делает.
Но для продолжения обработки мне нужно, чтобы дерево обновилось.
Обычно я делал так:
Код: c#
1.
await Task.Delay(10);

в предположении, что поток пользовательского интерфейса, получив управление, отрисует все, что было отложено, и только после этого мой поток вернется с паузы в контекст синхронизации.
Но сейчас столкнулся с тем, что может быть отрисовано не всё, то есть Delay(10) работает через раз, а Delay(100) работает лучше.
Из чего делаю вывод, что моё предположение было неверным.
Как же убедиться в том, что в очереди отрисовки визуального дерева ничего не осталось?
...
Рейтинг: 0 / 0
WPF: Как правильно дождаться обновления визуального дерева?
    #39602270
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
WPF: Как правильно дождаться обновления визуального дерева?
    #39602278
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробую. Но это на конкретный контрол, то есть нужно еще думать, куда его подвесить. Хорошо бы централизованный что ли какой-то способ.
Еще возникла мысль, запустить заглушку на диспетчере через BeginInvoke с низким приоритетом и ожидать ее завершения выполнения...
...
Рейтинг: 0 / 0
WPF: Как правильно дождаться обновления визуального дерева?
    #39602325
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProДействие делаю в потоке пользовательского интерфейса.
Shocker.Proпредположении, что поток пользовательского интерфейса, получив управление,
Дак в каком потоке работа? В основном? Тогда делай в дополнительном.
...
Рейтинг: 0 / 0
WPF: Как правильно дождаться обновления визуального дерева?
    #39602331
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Тогда делай в дополнительном.не могу, так как работа дальше с интерфейсом
...
Рейтинг: 0 / 0
WPF: Как правильно дождаться обновления визуального дерева?
    #39602334
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProPetro123Тогда делай в дополнительном.не могу, так как работа дальше с интерфейсом
Тогда странная диспетчеризация.
Должна делаться работа и на экране все моргать, т.к. все Paint события отработают.
Типа Control.Repaint or Paint там нет? Принудительной.
...
Рейтинг: 0 / 0
WPF: Как правильно дождаться обновления визуального дерева?
    #39602342
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProПопробую. Но это на конкретный контрол, то есть нужно еще думать, куда его подвесить. Хорошо бы централизованный что ли какой-то способ.
Еще возникла мысль, запустить заглушку на диспетчере через BeginInvoke с низким приоритетом и ожидать ее завершения выполнения...
Ну да, можно вот так:
Код: c#
1.
Dispatcher.Invoke(new Action(() => { }), DispatcherPriority.ContextIdle, null);


- DispatcherPriority.ContextIdle ниже, чем DispatcherPriority.Render. Соответственно, эта строка будет исполнена только после отработки поставленного в очередь диспетчера рендеринга.
...
Рейтинг: 0 / 0
WPF: Как правильно дождаться обновления визуального дерева?
    #39602347
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot Petro123]Тогда странная диспетчеризация.
Должна делаться работа и на экране все моргать, т.к. все Paint события отработают.
Это WPF, а не винфорс. Ваш К.О.
Petro123Типа Control.Repaint or Paint там нет? Принудительной.
А Control.Repaint что, синхронизации не требует?
...
Рейтинг: 0 / 0
WPF: Как правильно дождаться обновления визуального дерева?
    #39602353
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры ПавловныЭто WPF, а не винфорс. Ваш К.О.да. Тут особенности.

Сон Веры ПавловныА Control.Repaint что, синхронизации не требует?
Если в винде и потоке гуи то не требует.
...
Рейтинг: 0 / 0
WPF: Как правильно дождаться обновления визуального дерева?
    #39602363
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProPetro123Тогда делай в дополнительном.не могу, так как работа дальше с интерфейсом
Хмммм. Интересный топик.
Т.е. ты к примеру настолько забиваешь процессор работой в основном потоке, что гуи не перерисовывается.
Но дальше ты же не с пикселями работаешь?
Зачем после 1000 вставленных node перерисовать и продолжить?
...
Рейтинг: 0 / 0
WPF: Как правильно дождаться обновления визуального дерева?
    #39602371
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Хмммм. Интересный топик.
Т.е. ты к примеру настолько забиваешь процессор работой в основном потоке, что гуи не перерисовывается.
Но дальше ты же не с пикселями работаешь?
Зачем после 1000 вставленных node перерисовать и продолжить?
Да какое тут забивание процессора - человек же русским языком пишет, что его действия вызывают перерисовку, а в WPF она осуществляется в очереди диспетчера, т.е. не сразу по факту.
...
Рейтинг: 0 / 0
WPF: Как правильно дождаться обновления визуального дерева?
    #39602382
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры Павловны, т.е. не сразупочему не сразу?
Я и подумал, проц.занят. цикл for 10000 addNode
...
Рейтинг: 0 / 0
WPF: Как правильно дождаться обновления визуального дерева?
    #39602389
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Перерисовку вообще выключают у контролов при большой работе. Потом включают.
Так в 10 раз быстрее.
Но кому то нравится визуалАнимация.
Control.beginUpdate()
.....
...
Рейтинг: 0 / 0
WPF: Как правильно дождаться обновления визуального дерева?
    #39602393
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123почему не сразу?
Потому что так устроен WPF
Petro123Перерисовку вообще выключают у контролов при большой работе. Потом включают.
Можно вопрос? Вы давно работаете с WPF?
...
Рейтинг: 0 / 0
WPF: Как правильно дождаться обновления визуального дерева?
    #39602396
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры Павловны,
На wpf лежит проект. Скоро начну).
...
Рейтинг: 0 / 0
WPF: Как правильно дождаться обновления визуального дерева?
    #39602400
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры Павловны,
Я просил короткий ответ - почему не сразу перерисовка если проц. не загружен?
...
Рейтинг: 0 / 0
WPF: Как правильно дождаться обновления визуального дерева?
    #39602404
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Сон Веры Павловны,
Я просил короткий ответ - почему не сразу перерисовка если проц. не загружен?
Можете еще раз попросить, я еще раз дам ссылку .
...
Рейтинг: 0 / 0
WPF: Как правильно дождаться обновления визуального дерева?
    #39602407
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры Павловны,
И на том спасибо.
...
Рейтинг: 0 / 0
WPF: Как правильно дождаться обновления визуального дерева?
    #39602412
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
у свойств зависимости есть параметр
FrameworkPropertyMetadataOptions.AffectsRender
который сигнализирует о том, что Control необходимо перерендерить.
по идее, как только произойдет вызов PropertyChanged() для свойства связанного с этим свойством зависимости элемент управления должен будет перерендериться.
...
Рейтинг: 0 / 0
WPF: Как правильно дождаться обновления визуального дерева?
    #39602425
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtesу свойств зависимости есть параметр
FrameworkPropertyMetadataOptions.AffectsRender
который сигнализирует о том, что Control необходимо перерендерить.
по идее, как только произойдет вызов PropertyChanged() для свойства связанного с этим свойством зависимости элемент управления должен будет перерендериться.
Справка , кстати говоря, не говорит о том, с каким приоритетом будет выполнен рендеринг. Я ничего не смог найти в гугле на эту тему, поэтому, думаю, вполне можно предполагать, что рендеринг будет поставлен в чередь диспетчера.
...
Рейтинг: 0 / 0
WPF: Как правильно дождаться обновления визуального дерева?
    #39602437
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
await Dispatcher.BeginInvoke(new Action(() => { }), DispatcherPriority.ContextIdle);

вполне себе сработало )
...
Рейтинг: 0 / 0
WPF: Как правильно дождаться обновления визуального дерева?
    #39602441
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну пол логике вещей, как я вчегда и считал, выполняться будет в порядке заданном в
DispatcherPriority (в обратном порядке, чем выше приоритет, тем раньше будет выполнение)
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
var values = (IEnumerable<DispatcherPriority>)Enum.GetValues(typeof(DispatcherPriority));

foreach (var i in values.Where(p=>p != DispatcherPriority.Invalid))
{
    Debug.Print($">>> {i}={(int)i}");
    Dispatcher.BeginInvoke(i, new Action<object>((_) => Debug.Print($"<<< {i}={(int)i}")), null);
                
}
var t = DateTime.Now.AddSeconds(5);
while (t > DateTime.Now) { }



Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
>>> Inactive=0
>>> SystemIdle=1
>>> ApplicationIdle=2
>>> ContextIdle=3
>>> Background=4
>>> Input=5
>>> Loaded=6
>>> Render=7
>>> DataBind=8
>>> Normal=9
>>> Send=10
<<< Send=10
<<< Normal=9
<<< DataBind=8
<<< Render=7
<<< Loaded=6
<<< Input=5
<<< Background=4
<<< ContextIdle=3
<<< ApplicationIdle=2
<<< SystemIdle=1
...
Рейтинг: 0 / 0
WPF: Как правильно дождаться обновления визуального дерева?
    #39602468
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
попробуй просто через Dispatcher.Invoke с приоритетом Render вызвать какой то делегат, не суть важно даже какой. Это вызовет обработку очереди до заданного приоритета, после чего тебе вернется управление
...
Рейтинг: 0 / 0
WPF: Как правильно дождаться обновления визуального дерева?
    #39602480
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну я, собственно, выше отписал, что получилось )
спасибо!
...
Рейтинг: 0 / 0
WPF: Как правильно дождаться обновления визуального дерева?
    #39602484
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,

:) я не видел, есть еще Dispatcher.Run() и await Dispatcher.Yield(Priority)
...
Рейтинг: 0 / 0
25 сообщений из 45, страница 1 из 2
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / WPF: Как правильно дождаться обновления визуального дерева?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]