如何解决应用 NativeWinAPI 样式后 C# 过度重绘 WebView2 控件
在经历了各种形式的闪烁和图形故障后,我在网上搜索了可能的解决方案。唯一立即起作用的是使用以下帖子中的 NativeWinAPI 接受的解决方案: Avoid Flickering in Windows Forms?
在应用程序的主窗体中插入此代码并保留“this”句柄实际上消除了我在图形方面遇到的所有问题。
至少在我包含一个网络浏览器(WebView2 控件)之前。此控件与帖子中的代码一起导致控件本身不断重绘自身。这反过来会导致作为 WebView2 父级的整个用户控件中出现图形问题。其他控件忽明忽暗,超级烦人不愉快。
花了几个小时(真的是几天)试图找出问题所在并几乎重写了整个项目,问题被定位,并在禁用设置窗口样式的功能后立即消失。
我相当确定 WebView2 控件是唯一有问题的控件,因为我创建了每次重绘控件时写入控制台的 OnPaint 函数,禁用 webview2 会阻止其他控件被重绘,而启用后我会得到 100 个在几秒钟内重新绘制。
问题是禁用这些更改会使应用程序看起来更糟,因为它之前修复了所有闪烁和图形故障。
我不明白链接中的代码到底做了什么(对于我目前的知识来说太高级/复杂了)。如果有人能帮我弄清楚如何解决这个问题,我将不胜感激。
更新: 我为任何有兴趣解决这个问题的人创建了一个小型演示项目。 这是放在谷歌驱动器上的项目的7zip:
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 举报,一经查实,本站将立刻删除。