Уведомление о завершении визуализации в WPF - PullRequest
1 голос
/ 10 сентября 2010

Есть ли способ получить уведомление (например, по событию), когда визуал (пере) визуализируется?

В принципе, я хотел бы сделать снимок экрана, когда внешний вид визуала изменился,Я предполагаю, что поток рендеринга позаботится об этом в фоновом режиме.

Я стараюсь избегать периодического захвата снимка экрана, поскольку меня интересуют только изменения (например, при наведении курсора на кнопку изменился бы внешний вид).

Любая подсказка высоко ценится!

Ответы [ 4 ]

2 голосов
/ 04 декабря 2012

Лучший способ, который я нашел, - это добавить пустую панель в корневой каталог макета, добавить событие, подобное измененному размеру, и работать оттуда.

1 голос
/ 10 сентября 2010

Этот поток MSDN предоставляет довольно мало информации по этому вопросу. По сути это не на самом деле работает таким образом, и вы найдете там точные причины.

0 голосов
/ 07 октября 2017

У меня была похожая проблема, когда у меня был GridControl (devexpress WPF), с которым мне нужно было выполнять действие, когда оно перерисовывалось.Проблема была в том, что мне нужно было выполнить действие ПОСЛЕ того, как оно закончит заполнять сетку и рисовать все элементы.

Это решение взломано, однако на практике оно работает 100% времени без явных недостатков.Он работает путем простого запуска таймера после изменения видимого состояния и последующего запуска события.

public ctor()
{
    Grid.IsVisibleChanged += TableOnIsVisibleChanged;
}


const int _msItTakesToDrawGrid = 5;
private Timer _timer;
private void TableOnIsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e)
{
    if ((bool)e.NewValue != true || (bool)e.OldValue != false || _timer != null)
        return;


    _timer = new Timer { Interval = _msItTakesToDrawGrid };
    _timer.Elapsed += DoStuff;
    _timer.AutoReset = false;
    _timer.Start();
}

private void DoStuff(object sender, ElapsedEventArgs e)
{
    _timer.Stop();
    _timer= null;
    Dispatcher?.Invoke(stuff that needs to be done on the UI thread...);
}
0 голосов
/ 10 сентября 2010

Это невозможно в WPF.Лучше всего будет часто делать снимок в памяти и сравнивать его с предыдущим.Если вы обнаружите разницу, сохраните снимок.Для этого вы можете использовать событие CompositionTarget.Rendering .Просто убедитесь, что вы не делаете снимок в каждом событии (так как он вызывается так часто, как видеокарта меняет свой буфер).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...