【问题标题】:Winforms WPF Interop - WPF content fails to paintWinforms WPF 互操作 - WPF 内容无法绘制
【发布时间】:2009-01-22 21:21:43
【问题描述】:

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

这是一个已知问题吗?任何人都可以提出解决方法吗?

【问题讨论】:

  • 我很好奇......“通过 Winform chrome 看到下面的任何内容”实际上是双缓冲缓冲区的内容吗?在我们的情况下,它是。或者,你真的看到了下面的东西吗?您可能能够在像我这样的导航场景中进行区分。
  • 另一种判断它是否是双缓冲缓冲区的方法是,您看到的内容显示出来......经常被破坏或弄乱了。
  • 您可以尝试在连接上报告问题,而不仅仅是在论坛上发帖。我发现他们对 Connect 上的内容非常敏感,尤其是在您附加代码/重现步骤等时。connect.microsoft.com

标签: c# .net wpf winforms


【解决方案1】:

我们以前曾解决过这类问题。请参阅此 WPF 论坛post 了解有关我们特定风味的更多信息(我不知道这是否是同一个问题)。

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

_elementHost.Width++;

这是一个完整的黑客,丑陋,我什至都不好意思发布它。但没有其他任何东西对我们有用。因此,这绝对是一种解决方法。 (笑)

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

如果您找到解决问题的其他方法,我很想听听。

祝你好运,我知道我的头发掉了一些。

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

更新 2: 在我用上述技巧解决了刷新问题之后……我还有另一个问题需要解决,我认为这里值得一提。也就是说:在屏幕刷新之前有一定的延迟。这使得用户看起来像是在导航到另一个屏幕(它不是......它只是双缓冲缓冲区的内容)。我最终不得不在托管 ElementHost 的控件上手动调用 System.Windows.Forms.Control.Refresh()。这样一来,即使暂停仍然存在……至少屏幕是空白的……而且看起来用户并没有在某个地方导航……

【讨论】:

  • 感谢您的意见,我们最终做了一个类似但同样丑陋的黑客攻击
  • 谢谢夏山羊。正如您在我更新的答案中看到的那样,我已经提交了另一个 WPF 论坛帖子。我们会看看是否有任何结果。
  • 我刚刚收到了一组截图,显示了来自客户的错误报告中的相同问题。有趣的是,屏幕截图也是 Vista / Aero 设置(如 WPF 论坛帖子中所述),因此听起来这可能是一个关键因素。只是想我会分享它,因为它还没有在这个 SO 页面上提及。
  • 更正:我的客户在 Windows 7 上看到了这个问题,而不是在 Vista 上。
  • 我让它在 ++ 和 -- 之间交替,所以表格会不断增长。脏,但它的工作原理!
【解决方案2】:

以下内容对我有用。
Form_Activated 事件中,我添加了以下内容

elementHost1.HostContainer.InvalidateVisual();

【讨论】:

    【解决方案3】:

    我知道这个帖子比较老了,但是在.net的更高版本(即3.5)中,你可以尝试使用软件渲染模式。当您在 ElementHost 中托管 WPF 控件时,这似乎解决了很多问题。

    参考:Software rendering mode - WPF

    【讨论】:

    【解决方案4】:

    也许在 ElementHost 上调用 Invalidate?

    【讨论】:

      【解决方案5】:

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

      【讨论】:

      • 我使用 .NET Reflector 看了一下 ElementHost 背后的代码,实际上似乎有很多旋钮需要修改。不幸的是,我已经在这个问题上花费了太多时间。但是,Width 属性实际上是在基类上实现的。那里没有帮助。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-15
      • 2023-03-04
      • 2013-01-17
      • 1970-01-01
      • 2011-09-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多