微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

应用 NativeWinAPI 样式后 C# 过度重绘 WebView2 控件

如何解决应用 NativeWinAPI 样式后 C# 过度重绘 WebView2 控件

在经历了各种形式的闪烁和图形故障后,我在网上搜索了可能的解决方案。唯一立即起作用的是使用以下帖子中的 NativeWinAPI 接受的解决方案: Avoid Flickering in Windows Forms?

在应用程序的主窗体中插入此代码并保留“this”句柄实际上消除了我在图形方面遇到的所有问题。

至少在我包含一个网络浏览器(WebView2 控件)之前。此控件与帖子中的代码一起导致控件本身不断重绘自身。这反过来会导致作为 WebView2 父级的整个用户控件中出现图形问题。其他控件忽明忽暗,超级烦人不愉快。

花了几个小时(真的是几天)试图找出问题所在并几乎重写了整个项目,问题被定位,并在禁用设置窗口样式的功能后立即消失。

我相当确定 WebView2 控件是唯一有问题的控件,因为我创建了每次重绘控件时写入控制台的 OnPaint 函数,禁用 webview2 会阻止其他控件被重绘,而启用后我会得到 100 个在几秒钟内重新绘制。

问题是禁用这些更改会使应用程序看起来更糟,因为它之前修复了所有闪烁和图形故障。

我不明白链接中的代码到底做了什么(对于我目前的知识来说太高级/复杂了)。如果有人能帮我弄清楚如何解决这个问题,我将不胜感激。

更新: 我为任何有兴趣解决这个问题的人创建了一个小型演示项目。 这是放在谷歌驱动器上的项目的7zip:

FlickeringDemo.7z

WebView2 需要 Microsoft Edge Canary 浏览器才能正常工作: Download Edge Canary Here

主窗体具有控制图形改进和闪烁的 bool 标志。只需将其设置为 true/false 即可观察差异。

Debug.WriteLine(); - 将绘制事件计数器输出到 Visual Studio 的控制台中。

bool FlickerEnabled = false;
public MainForm()
{
    InitializeComponent();
    if (FlickerEnabled)
    {
        InitialiseGraphicalFixes();
    }
}

解决方法

我在我的项目中遇到了同样的问题,我已经设法解决了。 在提供的 FickeringDemo.zip 示例中,要停止使用该版本的 WebView2 (1.0.664.37) 闪烁,您应该将所有 .Net 控件中的 DoubleBuffered 属性设置为 true;有关如何执行此操作的示例,请参阅下面的代码。

我发现的另一件事是此修复在 WebView2 1.0.774.44 中停止工作;在那个版本中,其余的控件不会轻弹,但 WebView2 会轻弹很多。我没有找到解决它的方法...

public partial class WebViewControl : UserControl
{
    ...
    public WebViewControl()
    {
        ...
        //the fix to solve flicker if the WS_EX_COMPOSiTED is set on the top window
        SetDoubleBuffered(this,true);
    }
    
    private void SetDoubleBuffered(Control control,bool value)
    {
        try
        {
            control.GetType().GetProperty("DoubleBuffered",BindingFlags.NonPublic | BindingFlags.Instance).SetValue(control,value,null);
        }
        catch
        {
        }

        foreach (Control child in control.Controls)
        {
            SetDoubleBuffered(child,value);
        }
    }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。