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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

:) я не видел, есть еще Dispatcher.Run() и await Dispatcher.Yield(Priority)
15 фев 18, 16:29    [21194491]     Ответить | Цитировать Сообщить модератору
 Re: WPF: Как правильно дождаться обновления визуального дерева?  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 20286
О, это вообще то, что надо, он статический
await Dispatcher.Yield();
15 фев 18, 16:36    [21194523]     Ответить | Цитировать Сообщить модератору
 Re: WPF: Как правильно дождаться обновления визуального дерева?  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38458
Shocker.Pro
О, это вообще то, что надо, он статический
await Dispatcher.Yield();

Это идеально). Работает?
15 фев 18, 16:58    [21194607]     Ответить | Цитировать Сообщить модератору
 Re: WPF: Как правильно дождаться обновления визуального дерева?  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 20286
Да, мне помогло.
15 фев 18, 17:25    [21194703]     Ответить | Цитировать Сообщить модератору
 Re: WPF: Как правильно дождаться обновления визуального дерева?  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 20286
запускал с приоритетом, предложенным Сном Веры Павловны
await Dispatcher.Yield(DispatcherPriority.ContextIdle);
15 фев 18, 17:26    [21194704]     Ответить | Цитировать Сообщить модератору
 Re: WPF: Как правильно дождаться обновления визуального дерева?  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 4710
Наткнулся на проблему: в ItemsControl добавляется элемент, у которого активизирован AdornerLayer, и в нем есть содержимое. Если элемент уже добавлен, то активация AdornerLayer выполняется вполне нормально, и он отображается. Если активация производится одновременно с добавлением элемента, то сама активация тоже проходит нормально - layer есть, в него добавляется всё, что нужно, у класса, унаследованного от Adorner, нормально и с нормальными вменяемыми значениями отрабатывают ArrangeOverride/MeasureOverride, но.. просто ничего не отображается. Просто молча, без ошибок, без сообщений трассировки - просто вообще ничего. Стал экспериментировать - выяснил, что если активацию AdornerLayer делать в таске с небольшой задежкой, то всё отрисовывается нормально. Потом вспомнил, что где-то я про такое читал, и это вроде как решили более правильным способом. Потом вспомнил про этот топик. И всё заработало нормально :)
10 дек 18, 09:09    [21758788]     Ответить | Цитировать Сообщить модератору
 Re: WPF: Как правильно дождаться обновления визуального дерева?  [new]
Агнец за бортом
Member

Откуда:
Сообщений: 1239
Писал приложения на WPF/WPhone - вообще ни разу не сталкивался с чем-то похожим на проблему ТС.

Обработка должна продолжиться только после того, как обновится визуальное дерево?? Нафига?
26 дек 18, 00:25    [21773479]     Ответить | Цитировать Сообщить модератору
 Re: WPF: Как правильно дождаться обновления визуального дерева?  [new]
Roman Mejtes
Member

Откуда: г. Пермь
Сообщений: 3305
Агнец за бортом
Писал приложения на WPF/WPhone - вообще ни разу не сталкивался с чем-то похожим на проблему ТС.

Обработка должна продолжиться только после того, как обновится визуальное дерево?? Нафига?

на разных этапах выполнения диспатчера, разное состояние.
к примеру, не имеет смысла менять фокус, до приоритета input и вообще работать с вводом\выводом, binding.
до момент рендеринга, к примеру, можно не знать размер элемента. много раз сталкивался, когда это нужно, всегда использовал, но с умом надо делать, если вызывать из цикла, рекурсии и т.д.
26 дек 18, 00:38    [21773486]     Ответить | Цитировать Сообщить модератору
 Re: WPF: Как правильно дождаться обновления визуального дерева?  [new]
Roman Mejtes
Member

Откуда: г. Пермь
Сообщений: 3305
при обработке ввода с большой частотой не стоит использовать, к примеру, для MouseMove, DragAndDrop и т.д. и т.п. Ввод с клавы может быть тоже очень быстрый
26 дек 18, 00:40    [21773488]     Ответить | Цитировать Сообщить модератору
 Re: WPF: Как правильно дождаться обновления визуального дерева?  [new]
Агнец за бортом
Member

Откуда:
Сообщений: 1239
Roman Mejtes
до момент рендеринга, к примеру, можно не знать размер элемента.


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

И потом, весь MVVM про то, что VM ничего не знает про V. Кто должен знать про размер элемента?
26 дек 18, 01:55    [21773505]     Ответить | Цитировать Сообщить модератору
 Re: WPF: Как правильно дождаться обновления визуального дерева?  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 20286
Агнец за бортом
Писал приложения на WPF/WPhone - вообще ни разу не сталкивался с чем-то похожим на проблему ТС.

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

Но впервые столкнулся с необходимостью, когда выводил на экран лог обработки. Если не дожидаться, чтобы строчка появилась на экране, то основной алгоритм выплевывал следующую строчку (даже работая в фоновом потоке), в результате лог на экране обновлялся только после окончания алгоритма.
26 дек 18, 09:35    [21773584]     Ответить | Цитировать Сообщить модератору
 Re: WPF: Как правильно дождаться обновления визуального дерева?  [new]
Агнец за бортом
Member

Откуда:
Сообщений: 1239
Shocker.Pro
Но впервые столкнулся с необходимостью, когда выводил на экран лог обработки.


Но ты же понимаешь, что это абсурд?
26 дек 18, 12:17    [21773723]     Ответить | Цитировать Сообщить модератору
 Re: WPF: Как правильно дождаться обновления визуального дерева?  [new]
Roman Mejtes
Member

Откуда: г. Пермь
Сообщений: 3305
Агнец за бортом,

то есть программирование в View вы исключаете? создание своих элементов управления, изменения поведения существующих и так далее.
26 дек 18, 12:59    [21773763]     Ответить | Цитировать Сообщить модератору
 Re: WPF: Как правильно дождаться обновления визуального дерева?  [new]
Агнец за бортом
Member

Откуда:
Сообщений: 1239
Roman Mejtes
то есть программирование в View вы исключаете?


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

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

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

И никогда не опускался до описываемых штук, тем более до таких серьезных IT-вызовов, как отображение списка на форме.
26 дек 18, 13:20    [21773778]     Ответить | Цитировать Сообщить модератору
 Re: WPF: Как правильно дождаться обновления визуального дерева?  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 20286
Агнец за бортом
Но ты же понимаешь, что это абсурд?
Честно. Нет. Объясни.
26 дек 18, 16:50    [21774022]     Ответить | Цитировать Сообщить модератору
 Re: WPF: Как правильно дождаться обновления визуального дерева?  [new]
Агнец за бортом
Member

Откуда:
Сообщений: 1239
Shocker.Pro
Агнец за бортом
Но ты же понимаешь, что это абсурд?
Честно. Нет. Объясни.


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

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

Либо ты что-то не то делал, либо я не понимаю сути.
26 дек 18, 17:05    [21774040]     Ответить | Цитировать Сообщить модератору
 Re: WPF: Как правильно дождаться обновления визуального дерева?  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 20286
Агнец за бортом
List байндил на Observable и работал с ней - всё работало как ожидалось.
Если ты начинаешь непрерывно (быстро) заполнять коллекцию, то на экране изменения просто не успевают отображаться, так как данные поступают быстрее, чем поток пользовательского интерфейса соизволит обновить данные на экране, ибо обновление экрана возникает не по каждому твоему телодвижению.

А мне требовалось, чтобы лог бежал на экране. Так в чем абсурд-то?
26 дек 18, 18:59    [21774172]     Ответить | Цитировать Сообщить модератору
 Re: WPF: Как правильно дождаться обновления визуального дерева?  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38458
Shocker.Pro,
Читать то успевают поток строк?
26 дек 18, 19:14    [21774185]     Ответить | Цитировать Сообщить модератору
 Re: WPF: Как правильно дождаться обновления визуального дерева?  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 20286
Petro123
Shocker.Pro,
Читать то успевают поток строк?
бегущий поток показывает, что работа идет, кроме того, можно поставить на паузу и проанализировать, если на вид что-то не так.

Ты же профайлером пользовался скульным? необязательно успевать разбирать все запросы, чтобы понять, что все в норме или что-то не так
26 дек 18, 19:17    [21774195]     Ответить | Цитировать Сообщить модератору
 Re: WPF: Как правильно дождаться обновления визуального дерева?  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38458
Агнец за бортом,
По задаче, фиг знает.
В десктопе наоборот бывало выключал отрисовку и события чтобы не тормозило и не глючило.
26 дек 18, 19:18    [21774196]     Ответить | Цитировать Сообщить модератору
 Re: WPF: Как правильно дождаться обновления визуального дерева?  [new]
Агнец за бортом
Member

Откуда:
Сообщений: 1239
Shocker.Pro
А мне требовалось, чтобы лог бежал на экране


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

У меня лог именно "бежал" на экране. Видимо - недостаточно быстро.
26 дек 18, 20:23    [21774241]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: 1 2      [все]
Все форумы / WPF, Silverlight Ответить