WPF网页浏览器UI元素刷新

本文关键字:元素 刷新 UI 浏览器 网页 网页浏览 WPF | 更新日期: 2023-09-27 18:07:51

在c# WPF中,我创建了一个自定义UI元素,看起来像一个窗口,这样我就可以在我的WPF应用程序中拥有一个迷你桌面环境。这个"WindowControl"类有最大化、最小化、关闭、缩放、转换等功能。

这个窗口UI包含一个画布,这是其他嵌入UI元素的位置。例如,我可以在我的WindowControl画布中嵌入一个TreeView,并在屏幕上移动它,就像你在操作系统中打开Windows资源管理器一样。

一切都在工作,除了web浏览器。当我把内置的web浏览器控件放入我的WindowControl类的画布时,它不会刷新。我不是说刷新浏览器的url。我是说刷新UI元素本身。当我在屏幕上移动我的WindowControl类(带有嵌入式web浏览器)时,web浏览器在屏幕上到处留下了屏幕工件。

实际问题是:如何强制c# WPF中内置的web浏览器UI元素重新绘制自身,以便在调整大小/翻译时不会留下工件?

我将包含我的代码…但是,仅WindowControl类就有近1000行,这在这个论坛上是不愉快的。

到目前为止,我已经尝试了以下操作(没有成功):
webBrowser.Measure();
webBrowser.Arrange();
webBrowser.Dispatcher.Invoke(DispatcherPriority.Render, new Action(() => { }));
webBrowser.Width = XX;
webBrowser.Height = XX;
webBrowser.ActualWidth = XX;
webBrowser.ActualHeight = XX;
// As sugguested by Noseratio
IntPtr hwnd;
((IOleWindow)webBrowser.Document).GetWindow(out hwnd);
UpdateWindow(hwnd);

WPF网页浏览器UI元素刷新

我会尝试使用UpdateWindow(未经测试)强制更新:

  1. 通过IOleWindow获取WebBrowser.DocumentHWND

    IntPtr hwnd;
    ((IOleWindow)_webBrowser.Document).GetWindow(out hwnd);
    
  2. 通过p/invoke:

    调用UpdateWindow
    UpdateWindow(hwnd);
    

WinForms:

错误不能转换…"System.Windows.Forms。HtmlDocument' in ' pinvoke . native emethods . iolewindow '

<<p> 解决方案/strong>
public IntPtr GetHandle()
    {
        HtmlDocument doc = Document;
        if (doc == null || doc.DomDocument == null) return IntPtr.Zero;
        IntPtr hwnd;
        ((NativeMethods.IOleWindow)(doc.DomDocument)).GetWindow(out hwnd);
        return hwnd;
    }