在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);
答案 0 :(得分:0)
我尝试使用UpdateWindow
(未经测试)强制更新:
HWND
WebBrowser.Document
IntPtr hwnd;
((IOleWindow)_webBrowser.Document).GetWindow(out hwnd);
通过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;
}