Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / WPF, Silverlight Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 WPF: Как правильно дождаться обновления визуального дерева?  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 19959
Смысл в чем - я делаю некоторое действие, которое повлияет на отображение, то есть изменится визуальное дерево.
Действие делаю в потоке пользовательского интерфейса.
WPF откладывает обновление визуального дерева, пока мой поток что-то делает.
Но для продолжения обработки мне нужно, чтобы дерево обновилось.
Обычно я делал так:
await Task.Delay(10);
в предположении, что поток пользовательского интерфейса, получив управление, отрисует все, что было отложено, и только после этого мой поток вернется с паузы в контекст синхронизации.
Но сейчас столкнулся с тем, что может быть отрисовано не всё, то есть Delay(10) работает через раз, а Delay(100) работает лучше.
Из чего делаю вывод, что моё предположение было неверным.
Как же убедиться в том, что в очереди отрисовки визуального дерева ничего не осталось?
15 фев 18, 12:43    [21193539]     Ответить | Цитировать Сообщить модератору
 Re: WPF: Как правильно дождаться обновления визуального дерева?  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 4606
LayoutUpdated?
15 фев 18, 12:52    [21193581]     Ответить | Цитировать Сообщить модератору
 Re: WPF: Как правильно дождаться обновления визуального дерева?  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 19959
Попробую. Но это на конкретный контрол, то есть нужно еще думать, куда его подвесить. Хорошо бы централизованный что ли какой-то способ.
Еще возникла мысль, запустить заглушку на диспетчере через BeginInvoke с низким приоритетом и ожидать ее завершения выполнения...
15 фев 18, 13:05    [21193627]     Ответить | Цитировать Сообщить модератору
 Re: WPF: Как правильно дождаться обновления визуального дерева?  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 37082
Shocker.Pro
Действие делаю в потоке пользовательского интерфейса.

Shocker.Pro
предположении, что поток пользовательского интерфейса, получив управление,

Дак в каком потоке работа? В основном? Тогда делай в дополнительном.
15 фев 18, 13:48    [21193798]     Ответить | Цитировать Сообщить модератору
 Re: WPF: Как правильно дождаться обновления визуального дерева?  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 19959
Petro123
Тогда делай в дополнительном.
не могу, так как работа дальше с интерфейсом
15 фев 18, 13:52    [21193816]     Ответить | Цитировать Сообщить модератору
 Re: WPF: Как правильно дождаться обновления визуального дерева?  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 37082
Shocker.Pro
Petro123
Тогда делай в дополнительном.
не могу, так как работа дальше с интерфейсом

Тогда странная диспетчеризация.
Должна делаться работа и на экране все моргать, т.к. все Paint события отработают.
Типа Control.Repaint or Paint там нет? Принудительной.
15 фев 18, 13:58    [21193837]     Ответить | Цитировать Сообщить модератору
 Re: WPF: Как правильно дождаться обновления визуального дерева?  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 4606
Shocker.Pro
Попробую. Но это на конкретный контрол, то есть нужно еще думать, куда его подвесить. Хорошо бы централизованный что ли какой-то способ.
Еще возникла мысль, запустить заглушку на диспетчере через BeginInvoke с низким приоритетом и ожидать ее завершения выполнения...

Ну да, можно вот так:
Dispatcher.Invoke(new Action(() => { }), DispatcherPriority.ContextIdle, null);

- DispatcherPriority.ContextIdle ниже, чем DispatcherPriority.Render. Соответственно, эта строка будет исполнена только после отработки поставленного в очередь диспетчера рендеринга.
15 фев 18, 14:01    [21193857]     Ответить | Цитировать Сообщить модератору
 Re: WPF: Как правильно дождаться обновления визуального дерева?  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 4606
[quot Petro123]Тогда странная диспетчеризация.
Должна делаться работа и на экране все моргать, т.к. все Paint события отработают.
Это WPF, а не винфорс. Ваш К.О.
Petro123
Типа Control.Repaint or Paint там нет? Принудительной.

А Control.Repaint что, синхронизации не требует?
15 фев 18, 14:03    [21193872]     Ответить | Цитировать Сообщить модератору
 Re: WPF: Как правильно дождаться обновления визуального дерева?  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 37082
Сон Веры Павловны
Это WPF, а не винфорс. Ваш К.О.
да. Тут особенности.

Сон Веры Павловны
А Control.Repaint что, синхронизации не требует?

Если в винде и потоке гуи то не требует.
15 фев 18, 14:09    [21193896]     Ответить | Цитировать Сообщить модератору
 Re: WPF: Как правильно дождаться обновления визуального дерева?  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 37082
Shocker.Pro
Petro123
Тогда делай в дополнительном.
не могу, так как работа дальше с интерфейсом

Хмммм. Интересный топик.
Т.е. ты к примеру настолько забиваешь процессор работой в основном потоке, что гуи не перерисовывается.
Но дальше ты же не с пикселями работаешь?
Зачем после 1000 вставленных node перерисовать и продолжить?
15 фев 18, 14:16    [21193931]     Ответить | Цитировать Сообщить модератору
 Re: WPF: Как правильно дождаться обновления визуального дерева?  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 4606
Petro123
Хмммм. Интересный топик.
Т.е. ты к примеру настолько забиваешь процессор работой в основном потоке, что гуи не перерисовывается.
Но дальше ты же не с пикселями работаешь?
Зачем после 1000 вставленных node перерисовать и продолжить?

Да какое тут забивание процессора - человек же русским языком пишет, что его действия вызывают перерисовку, а в WPF она осуществляется в очереди диспетчера, т.е. не сразу по факту.
15 фев 18, 14:22    [21193957]     Ответить | Цитировать Сообщить модератору
 Re: WPF: Как правильно дождаться обновления визуального дерева?  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 37082
Сон Веры Павловны
, т.е. не сразу
почему не сразу?
Я и подумал, проц.занят. цикл for 10000 addNode
15 фев 18, 14:27    [21193987]     Ответить | Цитировать Сообщить модератору
 Re: WPF: Как правильно дождаться обновления визуального дерева?  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 37082
Перерисовку вообще выключают у контролов при большой работе. Потом включают.
Так в 10 раз быстрее.
Но кому то нравится визуалАнимация.
Control.beginUpdate()
.....
15 фев 18, 14:35    [21194015]     Ответить | Цитировать Сообщить модератору
 Re: WPF: Как правильно дождаться обновления визуального дерева?  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 4606
Petro123
почему не сразу?

Потому что так устроен WPF
Petro123
Перерисовку вообще выключают у контролов при большой работе. Потом включают.

Можно вопрос? Вы давно работаете с WPF?
15 фев 18, 14:38    [21194025]     Ответить | Цитировать Сообщить модератору
 Re: WPF: Как правильно дождаться обновления визуального дерева?  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 37082
Сон Веры Павловны,
На wpf лежит проект. Скоро начну).
15 фев 18, 14:39    [21194035]     Ответить | Цитировать Сообщить модератору
 Re: WPF: Как правильно дождаться обновления визуального дерева?  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 37082
Сон Веры Павловны,
Я просил короткий ответ - почему не сразу перерисовка если проц. не загружен?
15 фев 18, 14:41    [21194048]     Ответить | Цитировать Сообщить модератору
 Re: WPF: Как правильно дождаться обновления визуального дерева?  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 4606
Petro123
Сон Веры Павловны,
Я просил короткий ответ - почему не сразу перерисовка если проц. не загружен?

Можете еще раз попросить, я еще раз дам ссылку.
15 фев 18, 14:43    [21194062]     Ответить | Цитировать Сообщить модератору
 Re: WPF: Как правильно дождаться обновления визуального дерева?  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 37082
Сон Веры Павловны,
И на том спасибо.
15 фев 18, 14:45    [21194072]     Ответить | Цитировать Сообщить модератору
 Re: WPF: Как правильно дождаться обновления визуального дерева?  [new]
Roman Mejtes
Member

Откуда: г. Пермь
Сообщений: 3171
у свойств зависимости есть параметр
FrameworkPropertyMetadataOptions.AffectsRender
который сигнализирует о том, что Control необходимо перерендерить.
по идее, как только произойдет вызов PropertyChanged() для свойства связанного с этим свойством зависимости элемент управления должен будет перерендериться.
15 фев 18, 14:52    [21194098]     Ответить | Цитировать Сообщить модератору
 Re: WPF: Как правильно дождаться обновления визуального дерева?  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 4606
Roman Mejtes
у свойств зависимости есть параметр
FrameworkPropertyMetadataOptions.AffectsRender
который сигнализирует о том, что Control необходимо перерендерить.
по идее, как только произойдет вызов PropertyChanged() для свойства связанного с этим свойством зависимости элемент управления должен будет перерендериться.

Справка, кстати говоря, не говорит о том, с каким приоритетом будет выполнен рендеринг. Я ничего не смог найти в гугле на эту тему, поэтому, думаю, вполне можно предполагать, что рендеринг будет поставлен в чередь диспетчера.
15 фев 18, 15:15    [21194183]     Ответить | Цитировать Сообщить модератору
 Re: WPF: Как правильно дождаться обновления визуального дерева?  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 19959
await Dispatcher.BeginInvoke(new Action(() => { }), DispatcherPriority.ContextIdle);
вполне себе сработало )
15 фев 18, 15:29    [21194231]     Ответить | Цитировать Сообщить модератору
 Re: WPF: Как правильно дождаться обновления визуального дерева?  [new]
Roman Mejtes
Member

Откуда: г. Пермь
Сообщений: 3171
ну пол логике вещей, как я вчегда и считал, выполняться будет в порядке заданном в
DispatcherPriority (в обратном порядке, чем выше приоритет, тем раньше будет выполнение)
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) { }



>>> 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
15 фев 18, 15:36    [21194264]     Ответить | Цитировать Сообщить модератору
 Re: WPF: Как правильно дождаться обновления визуального дерева?  [new]
Roman Mejtes
Member

Откуда: г. Пермь
Сообщений: 3171
попробуй просто через Dispatcher.Invoke с приоритетом Render вызвать какой то делегат, не суть важно даже какой. Это вызовет обработку очереди до заданного приоритета, после чего тебе вернется управление
15 фев 18, 16:13    [21194421]     Ответить | Цитировать Сообщить модератору
 Re: WPF: Как правильно дождаться обновления визуального дерева?  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 19959
ну я, собственно, выше отписал, что получилось )
спасибо!
15 фев 18, 16:25    [21194477]     Ответить | Цитировать Сообщить модератору
 Re: WPF: Как правильно дождаться обновления визуального дерева?  [new]
Roman Mejtes
Member

Откуда: г. Пермь
Сообщений: 3171
Shocker.Pro,

:) я не видел, есть еще Dispatcher.Run() и await Dispatcher.Yield(Priority)
15 фев 18, 16:29    [21194491]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / WPF, Silverlight Ответить