Winforms WPF Interop - WPF内容无法绘制

时间:2009-01-22 21:21:43

标签: c# .net wpf winforms

我有一个使用ElementHost来显示WPF UserControl的WinForm。表单加载时,每50次左右,WPF内容无法绘制。您可以通过WinForm chrome查看下面的内容。调整窗口大小可以显示WPF内容。

这是一个已知问题吗?有人可以建议解决方法吗?

5 个答案:

答案 0 :(得分:12)

我们之前已经打过这些类型的问题。有关我们特定风味的更多信息,请参阅此WPF论坛post(我不知道是否存在相同的问题)。

我们发现唯一可行的方法是更改ElementHost的大小

_elementHost.Width++;

这是一个完整的黑客,丑陋,甚至发布它我都很尴尬。但没有别的东西对我们有用。所以,这绝对是一种解决方法。 (GRIN)

我们在ElementHost上尝试了Invalidate,Refresh和我们能想到的一切......我们还在WPF托管内容上尝试了InvalidateMeasure,InvalidateArrange和InvalidateVisual。没有运气。

如果您找到另一种方法来解决问题,我很乐意听到。

祝你好运,我知道我已经失去了一些头发。

更新1: 我已就此提交了另一个WPF论坛post。也许我们可以得到微软的回复。当然对我来说似乎是个错误。

更新2: 我用上面的黑客修复了刷新问题后......我还有另外一个问题要解决,我觉得这里值得一提。那就是:在屏幕刷新之前有一定的延迟。这使得用户似乎导航到另一个屏幕(它不是......它只是双缓冲缓冲区的内容)。我最终不得不在托管ElementHost的Control上手动调用System.Windows.Forms.Control.Refresh()。通过这种方式,即使暂停仍然存在...至少屏幕是空白的...并且它看起来不像用户在某处导航...

答案 1 :(得分:1)

以下为我工作。
Form_Activated事件中,我添加了以下内容

elementHost1.HostContainer.InvalidateVisual();

答案 2 :(得分:1)

我知道这篇文章很旧,但是在更新版本的.net(即3.5)中,你可以尝试使用软件渲染模式。当你在ElementHost中托管WPF控件时,这似乎解决了很多问题。

参考:Software rendering mode - WPF

答案 3 :(得分:0)

也许在ElementHost上调用Invalidate?

答案 4 :(得分:0)

您是否尝试使用反射来查看_elementHost.Width ++后面的代码?