ElementHost 中的 WPF 控件呈现问题

Posted

技术标签:

【中文标题】ElementHost 中的 WPF 控件呈现问题【英文标题】:Rendering issue with WPF controls inside ElementHost 【发布时间】:2012-08-05 06:51:35 【问题描述】:

我有一个 WinForms 控件,里面有一个 TableLayoutPanel,其中包含多个 ElementHosts,每个 ElementHost 包含一个 WPF 控件。

一切正常,除非控件的大小大于窗口并且ScrollBar 存在;当我向下滚动时,控件会呈现扭曲,就像这样 -

在最大化窗口或重新调整大小时,控件会正确呈现 (减小尺寸以使控件离开可见区域,然后再次增大尺寸以使它们回到可见区域)

这不会发生在同一窗口中的 WinForms 控件只是 WPF 控件中;知道为什么会发生这种情况以及任何解决方案吗?

【问题讨论】:

任何人,任何事......如果有任何其他细节可以帮助解决这个问题,请告诉我! 可能重复***.com/questions/2589948/… 请注意,在 Windows 7 上,使用“经典”Windows 主题时不会出现此问题。似乎只有在使用“Aero”主题时才会发生。 @DimitriC。感谢您提供信息,在这种情况下没有注意到,但是是的,我在 WPF/WinForms 互操作性中遇到了一些与主题相关的问题,他们总是让我想起浏览器不兼容问题,并且黑客使用了他们的 :) 【参考方案1】:
this.Loaded += delegate

    var source = PresentationSource.FromVisual(this);
    var hwndTarget = source.CompositionTarget as HwndTarget;

    if (hwndTarget != null)
    
        hwndTarget.RenderMode = RenderMode.SoftwareOnly;
    
;

尝试在您托管的 wpf 控件中使用它。这是在 win 表单中托管的 wpf 控件的已知呈现问题。将渲染模式更改为仅软件即可解决问题。

【讨论】:

谢谢 Valentin,听起来很有趣,会尝试这个解决方案,希望它能奏效。 提到了一些关于性能影响的信息here 对我来说很好。我有拆分器和几个 ElementHost,应用此方法后,碎片和黑色部分不再显示。 这在我的机器上工作但导致其他一些崩溃(***.com/questions/17473857/… 和 ***.com/questions/7719627/…)我仍然找不到更好的解决方案 这是否意味着我们在使用软件渲染时会损失性能,并且更多地依赖CPU?【参考方案2】:

我遇到了类似的问题并解决了在TableLayoutPanel 的滚动事件中强制刷新ElmenetHost

【讨论】:

谢谢 Mackho,会试试这个,看看它是否有效。顺便说一句,这对性能有影响吗? 不,我没有注意到性能有任何显着下降,但我不得不说我的表格很轻,所以我不能保证任何事情;)【参考方案3】:

好的,这听起来像是完全的 B.S.但它对我有用:在表单的 Load 事件中,调整表单大小。

public class MyForm : Form

   public MyForm()
   
      Load += (o, e) =>  Width -=1; Width +=1; ;
   

调整表单大小后,我无法强制显示问题。

【讨论】:

听起来很有趣,我会尝试测试一下,看看它是否适用于我的应用程序。 我想知道为什么这会被否决。它实际上为我解决了问题 不确定何时/谁反对它,但它太旧了,任何人都无法记住。我也不记得我是否曾经尝试过,但肯定会认为它是一种潜在的解决方案。

以上是关于ElementHost 中的 WPF 控件呈现问题的主要内容,如果未能解决你的问题,请参考以下文章

WinForm中调用WPF控件

在默认 AppDomain 中的 Winforms 中托管 WPF 用户控件的弹出窗口中的选项卡导航损坏

将 WPF 控件与 WinForms 一起使用

如何将此 WPF 控件添加到我的 WinForm 中?

.Net:如何在 Windows 窗体应用程序中使用 WPF 用户控件?

通过 ElementHost 将 WPF 应用程序转换为 UserControl 以在 WinForms 应用程序中使用