powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / WPF: Как правильно дождаться обновления визуального дерева?
45 сообщений из 45, показаны все 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
WPF: Как правильно дождаться обновления визуального дерева?
    #39602494
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
О, это вообще то, что надо, он статический
Код: c#
1.
await Dispatcher.Yield();
...
Рейтинг: 0 / 0
WPF: Как правильно дождаться обновления визуального дерева?
    #39602515
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProО, это вообще то, что надо, он статический
Код: c#
1.
await Dispatcher.Yield();


Это идеально). Работает?
...
Рейтинг: 0 / 0
WPF: Как правильно дождаться обновления визуального дерева?
    #39602532
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, мне помогло.
...
Рейтинг: 0 / 0
WPF: Как правильно дождаться обновления визуального дерева?
    #39602533
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
запускал с приоритетом, предложенным Сном Веры Павловны
Код: c#
1.
await Dispatcher.Yield(DispatcherPriority.ContextIdle);
...
Рейтинг: 0 / 0
WPF: Как правильно дождаться обновления визуального дерева?
    #39745113
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Наткнулся на проблему: в ItemsControl добавляется элемент, у которого активизирован AdornerLayer, и в нем есть содержимое. Если элемент уже добавлен, то активация AdornerLayer выполняется вполне нормально, и он отображается. Если активация производится одновременно с добавлением элемента, то сама активация тоже проходит нормально - layer есть, в него добавляется всё, что нужно, у класса, унаследованного от Adorner, нормально и с нормальными вменяемыми значениями отрабатывают ArrangeOverride/MeasureOverride, но.. просто ничего не отображается. Просто молча, без ошибок, без сообщений трассировки - просто вообще ничего. Стал экспериментировать - выяснил, что если активацию AdornerLayer делать в таске с небольшой задежкой, то всё отрисовывается нормально. Потом вспомнил, что где-то я про такое читал, и это вроде как решили более правильным способом. Потом вспомнил про этот топик. И всё заработало нормально :)
...
Рейтинг: 0 / 0
WPF: Как правильно дождаться обновления визуального дерева?
    #39753170
Агнец за бортом
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Писал приложения на WPF/WPhone - вообще ни разу не сталкивался с чем-то похожим на проблему ТС.

Обработка должна продолжиться только после того, как обновится визуальное дерево?? Нафига?
...
Рейтинг: 0 / 0
WPF: Как правильно дождаться обновления визуального дерева?
    #39753175
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Агнец за бортомПисал приложения на WPF/WPhone - вообще ни разу не сталкивался с чем-то похожим на проблему ТС.

Обработка должна продолжиться только после того, как обновится визуальное дерево?? Нафига?
на разных этапах выполнения диспатчера, разное состояние.
к примеру, не имеет смысла менять фокус, до приоритета input и вообще работать с вводом\выводом, binding.
до момент рендеринга, к примеру, можно не знать размер элемента. много раз сталкивался, когда это нужно, всегда использовал, но с умом надо делать, если вызывать из цикла, рекурсии и т.д.
...
Рейтинг: 0 / 0
WPF: Как правильно дождаться обновления визуального дерева?
    #39753176
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
при обработке ввода с большой частотой не стоит использовать, к примеру, для MouseMove, DragAndDrop и т.д. и т.п. Ввод с клавы может быть тоже очень быстрый
...
Рейтинг: 0 / 0
WPF: Как правильно дождаться обновления визуального дерева?
    #39753186
Агнец за бортом
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtesдо момент рендеринга, к примеру, можно не знать размер элемента.

Не понимаю, весь интерфейс описывается декларативно.

И потом, весь MVVM про то, что VM ничего не знает про V. Кто должен знать про размер элемента?
...
Рейтинг: 0 / 0
WPF: Как правильно дождаться обновления визуального дерева?
    #39753236
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Агнец за бортомПисал приложения на WPF/WPhone - вообще ни разу не сталкивался с чем-то похожим на проблему ТС.

Обработка должна продолжиться только после того, как обновится визуальное дерево?? Нафига?По поводу чего именно этот топик был мной создан - точно не помню, кажется что-то с разворачиванием узлов дерева, мне нужно было дождаться, когда они реально появятся на экране.

Но впервые столкнулся с необходимостью, когда выводил на экран лог обработки. Если не дожидаться, чтобы строчка появилась на экране, то основной алгоритм выплевывал следующую строчку (даже работая в фоновом потоке), в результате лог на экране обновлялся только после окончания алгоритма.
...
Рейтинг: 0 / 0
WPF: Как правильно дождаться обновления визуального дерева?
    #39753334
Агнец за бортом
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProНо впервые столкнулся с необходимостью, когда выводил на экран лог обработки.

Но ты же понимаешь, что это абсурд?
...
Рейтинг: 0 / 0
WPF: Как правильно дождаться обновления визуального дерева?
    #39753353
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Агнец за бортом,

то есть программирование в View вы исключаете? создание своих элементов управления, изменения поведения существующих и так далее.
...
Рейтинг: 0 / 0
WPF: Как правильно дождаться обновления визуального дерева?
    #39753367
Агнец за бортом
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtesто есть программирование в View вы исключаете?

Я всю логику убирал в VM и считал это единственно правильным подходом.

View - это XAML, какое там программирование? CodeBehind, разумеется, пустой.

Ни в одном моём приложении - не было готовых/стандартных UI контролов; всё рисовалось в бленде.

И никогда не опускался до описываемых штук, тем более до таких серьезных IT-вызовов, как отображение списка на форме.
...
Рейтинг: 0 / 0
WPF: Как правильно дождаться обновления визуального дерева?
    #39753525
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Агнец за бортомНо ты же понимаешь, что это абсурд?Честно. Нет. Объясни.
...
Рейтинг: 0 / 0
WPF: Как правильно дождаться обновления визуального дерева?
    #39753536
Агнец за бортом
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProАгнец за бортомНо ты же понимаешь, что это абсурд?Честно. Нет. Объясни.

Задачу отображения списка на UI решать с помощью каких-то низкоуровневых хаков - абсурд.

List байндил на Observable и работал с ней - всё работало как ожидалось.

Либо ты что-то не то делал, либо я не понимаю сути.
...
Рейтинг: 0 / 0
WPF: Как правильно дождаться обновления визуального дерева?
    #39753606
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Агнец за бортомList байндил на Observable и работал с ней - всё работало как ожидалось.Если ты начинаешь непрерывно (быстро) заполнять коллекцию, то на экране изменения просто не успевают отображаться, так как данные поступают быстрее, чем поток пользовательского интерфейса соизволит обновить данные на экране, ибо обновление экрана возникает не по каждому твоему телодвижению.

А мне требовалось, чтобы лог бежал на экране. Так в чем абсурд-то?
...
Рейтинг: 0 / 0
WPF: Как правильно дождаться обновления визуального дерева?
    #39753613
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,
Читать то успевают поток строк?
...
Рейтинг: 0 / 0
WPF: Как правильно дождаться обновления визуального дерева?
    #39753616
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Shocker.Pro,
Читать то успевают поток строк?бегущий поток показывает, что работа идет, кроме того, можно поставить на паузу и проанализировать, если на вид что-то не так.

Ты же профайлером пользовался скульным? необязательно успевать разбирать все запросы, чтобы понять, что все в норме или что-то не так
...
Рейтинг: 0 / 0
WPF: Как правильно дождаться обновления визуального дерева?
    #39753617
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Агнец за бортом,
По задаче, фиг знает.
В десктопе наоборот бывало выключал отрисовку и события чтобы не тормозило и не глючило.
...
Рейтинг: 0 / 0
WPF: Как правильно дождаться обновления визуального дерева?
    #39753643
Агнец за бортом
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProА мне требовалось, чтобы лог бежал на экране

Бежал/быстро... Такие четкие характеристики..

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


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