WPF Web浏览器UI元素刷新

时间:2014-06-08 15:47:06

标签: c# wpf webbrowser-control

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

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

除了网络浏览器外,一切正常。当我将内置的Web浏览器控件放入我的WindowControl类的画布时,它不会刷新。我不想刷新浏览器的网址。我的意思是刷新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);

2 个答案:

答案 0 :(得分:0)

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

  1. 通过IOleWindow

    获取HWND WebBrowser.Document
    IntPtr hwnd;
    ((IOleWindow)_webBrowser.Document).GetWindow(out hwnd);
    
  2. 通过p/invoke致电UpdateWindow

    UpdateWindow(hwnd);
    

答案 1 :(得分:0)

对于WinForms:

错误无法转换......' System.Windows.Forms.HtmlDocument' in' PInvoke.NativeMethods.IOleWindow'

<强>解决方案

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;
    }