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 控件呈现问题的主要内容,如果未能解决你的问题,请参考以下文章
在默认 AppDomain 中的 Winforms 中托管 WPF 用户控件的弹出窗口中的选项卡导航损坏
.Net:如何在 Windows 窗体应用程序中使用 WPF 用户控件?
通过 ElementHost 将 WPF 应用程序转换为 UserControl 以在 WinForms 应用程序中使用