WPF控件在ElementHost内部的渲染问题

14

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

一切都正常工作,除非控件的大小超过窗口并且出现了ScrollBar; 当我向下滚动时,控件会呈现扭曲的形状,如下图所示 -

进入图像描述

当最大化窗口或重新调整窗口大小时,控件会正确渲染(将大小减小使控件超出可见区域,然后再增加大小将其带回可见区域)

在同一个窗口中,WinForms控件不会出现这种情况,只有WPF控件会出现; 你知道为什么会出现这种情况吗?有没有解决方法?


任何人、任何事……如果有其他细节可以帮助解决这个问题,请告诉我! - akjoshi
可能是重复的问题 https://dev59.com/A03Sa4cB1Zd3GeqPrgaX - jpierson
1
请注意,在Windows 7上,当使用“经典”Windows主题时,不会出现此问题。似乎只有在使用“Aero”主题时才会发生。 - Dimitri C.
@DimitriC。感谢您的信息,我没有注意到这一点,但是我确实遇到了一些与WPF / WinForms互操作性相关的主题问题,它们总是让我想起浏览器不兼容性问题和使用的技巧 :) - akjoshi
3个回答

15
this.Loaded += delegate
{
    var source = PresentationSource.FromVisual(this);
    var hwndTarget = source.CompositionTarget as HwndTarget;

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

尝试在您托管的WPF控件中使用该方法。这是一个已知的呈现问题,适用于在Win Forms中托管的WPF控件。将呈现模式更改为仅软件即可解决问题。


谢谢 Valentin,听起来很有趣,我会尝试这个解决方案并希望它能够奏效。 - akjoshi
这里提到了一些关于性能影响的信息(链接:http://blogs.msdn.com/b/jgoldb/archive/2007/10/10/performance-improvements-in-wpf-in-net-3-5-3-0-sp1.aspx)。 - akjoshi
对我来说运行良好。我有分割器和几个ElementHosts,在应用此方法后,碎片化和黑色部分不再显示。 - Mike Fuchs
这在我的电脑上运行正常,但导致其他一些电脑崩溃了(https://dev59.com/MHTYa4cB1Zd3GeqPqhiL 和 http://stackoverflow.com/questions/7719627/wpf-elementhost-in-winforms-crashes-windows-when-maximized)。我仍然找不到更好的解决方案。 - Eduardo Wada
这是否意味着使用软件渲染会降低性能,更加依赖于 CPU? - joe
我的Winform ElementHost内有一个WPF控件,但在我的双屏电脑的一个屏幕上无法绘制(但在另一个屏幕上可以正常工作!?)。这解决了问题。 - Maxter

1

我曾经遇到过类似的问题,通过在TableLayoutPanel的滚动事件中强制刷新ElmenetHost来解决了这个问题。


谢谢Mackho,我会尝试一下看看是否有效。顺便问一下,这对性能有影响吗? - akjoshi
不,我没有注意到任何显著的性能下降,但我必须说我的表格非常轻,所以我不能保证你什么;) - MaRuf

1

好的,这听起来可能完全是胡说八道,但对我有效:在窗体的Load事件中,调整窗体大小。

public class MyForm : Form
{
   public MyForm()
   {
      Load += (o, e) => { Width -=1; Width +=1; };
   }
}
被调整大小后,我无法强制显示问题。

听起来非常有趣,我会尝试测试一下,看看它是否在我的应用程序中起作用。 - akjoshi
我想知道为什么这个帖子收到了反对票。它实际上解决了我的问题。 - Scott Baker
不确定是谁何时对其进行了负评,但它太旧了以至于没有人记得了。我也不记得自己是否尝试过,但我会点赞,因为它肯定是一个潜在的解决方案。 - akjoshi
实际上,在我们的一些代码中仍然使用这种方法。值得考虑作为一个选项。 - Kahuna

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接