Winforms WPF Interop - содержимое WPF не удается нарисовать - PullRequest
9 голосов
/ 23 января 2009

У меня есть WinForm, которая использует ElementHost для отображения WPF UserControl. Один раз каждые 50 раз или около того, когда форма загружается, содержимое WPF не может рисовать. Через хром WinForm вы можете видеть все, что ниже. Изменение размера окна приводит к отображению содержимого WPF.

Это известная проблема? Кто-нибудь может предложить обходной путь?

Ответы [ 5 ]

12 голосов
/ 28 февраля 2009

Мы боролись с такими проблемами раньше. См. Этот форум WPF сообщение для получения дополнительной информации о нашем конкретном аромате (я не знаю, является ли это той же проблемой или нет).

Единственное, что мы нашли для работы, это изменение размера ElementHost .

_elementHost.Width++;

Это полный взлом, безобразный, и мне стыдно даже публиковать его. Но ничто другое никогда не помогало нам. Таким образом, это определенно обходной путь. (Гринь)

Мы попробовали Invalidate, Refresh и все, что могли придумать ... на ElementHost. Мы также попробовали InvalidateMeasure, InvalidateArrange и InvalidateVisual для содержимого, размещенного в WPF. Не повезло.

Если вы найдете другой способ исправить вашу проблему, я хотел бы услышать об этом.

Удачи, я знаю, что потерял несколько волос на этом.

Обновление 1: Я отправил еще один форум WPF пост на эту тему. Может быть, мы можем получить ответ от Microsoft. Конечно, мне это кажется ошибкой.

Обновление 2: После того, как я исправил проблему с обновлением вышеупомянутым хаком ... У меня все еще была другая проблема, которую я решил упомянуть здесь. То есть: была определенная задержка до обновления экрана. Это создавало впечатление, что пользователь переходил на другой экран (это не было ... это было просто содержимое буфера двойной буферизации). В итоге мне пришлось вручную вызывать System.Windows.Forms.Control.Refresh () для элемента управления, в котором размещался ElementHost. Таким образом, хотя пауза все еще была ... по крайней мере, экран был пуст ... и не было похоже, что пользователь куда-то перемещался ...

1 голос
/ 11 февраля 2015

Я знаю, что этот пост старый, но в более поздней версии .net (т.е. 3.5) вы можете попробовать использовать режим программного рендеринга Кажется, это решает множество проблем, когда вы размещаете WPF-элемент управления в ElementHost.

Ссылка: Режим программного рендеринга - WPF

1 голос
/ 29 октября 2012

у меня сработало следующее.
На событие Form_Activated я добавил следующее

elementHost1.HostContainer.InvalidateVisual();
0 голосов
/ 03 марта 2009

Вы пытались использовать отражение, чтобы увидеть код, стоящий за _elementHost.Width ++?

0 голосов
/ 23 января 2009

Может, вызвать Invalidate на ElementHost?

...