拖拽Form1设计器中的UserControl时,其尺寸为何反复变化?
问题解决:WinForms UserControl拖拽调整尺寸时内部地图区域异常缩小
问题原因
你的代码在UserControl构造函数中直接初始化DotNetBrowser的IEngine和IBrowser,但Visual Studio设计器加载控件时也会执行构造函数。设计模式下运行浏览器引擎会导致控件渲染异常,出现拖拽时尺寸正常、松开后内部地图区域缩小的问题。另外,静态的engine和browser字段会导致多个控件实例共享同一资源,进一步引发冲突。
解决步骤
- 仅在运行时初始化DotNetBrowser组件:通过
DesignMode属性判断当前是否处于设计模式,仅非设计模式下才创建引擎和浏览器控件。 - 使用实例字段替代静态字段:避免多实例共享资源导致的异常。
- 释放DotNetBrowser资源:重写
Dispose方法,确保引擎和浏览器被正确关闭,防止内存泄漏。
修改后的完整代码
using System; using System.Windows.Forms; using DotNetBrowser.Browser; using DotNetBrowser.Engine; using DotNetBrowser.WinForms; namespace Weather { public partial class GoogleMapsUserControl : UserControl { // 改为实例字段,避免多实例冲突 private IBrowser _browser; private IEngine _engine; private BrowserView _browserView; public GoogleMapsUserControl() { InitializeComponent(); // 仅在非设计模式下初始化DotNetBrowser if (!DesignMode) { InitializeBrowser(); } } private void InitializeBrowser() { _engine = EngineFactory.Create(new EngineOptions.Builder { LicenseKey = "KEY HERE" }.Build()); _browserView = new BrowserView() { Dock = DockStyle.Fill }; _browser = _engine.CreateBrowser(); _browser.Navigation.LoadProgressChanged += Navigation_LoadProgressChanged; _browser.Navigation.LoadFinished += Navigation_LoadFinished; _browser.Navigation.LoadUrl(@"D:\Csharp Projects\Weather\map.html"); _browserView.InitializeFrom(_browser); this.Controls.Add(_browserView); } private void Navigation_LoadProgressChanged(object sender, DotNetBrowser.Navigation.Events.LoadProgressChangedEventArgs e) { } private void Navigation_LoadFinished(object sender, DotNetBrowser.Navigation.Events.LoadFinishedEventArgs e) { } private void GoogleMapsUserControl_Load(object sender, EventArgs e) { } // 重写Dispose方法,释放DotNetBrowser资源 protected override void Dispose(bool disposing) { if (disposing) { _browser?.Dispose(); _engine?.Dispose(); _browserView?.Dispose(); components?.Dispose(); } base.Dispose(disposing); } } }
额外说明
- 设计模式下,UserControl会显示空白(因为没有初始化浏览器),这是正常现象,运行时会正常加载地图。
- 确保
map.html中的地图页面设置了正确的响应式布局,比如给html/body设置width:100%;height:100%;margin:0;padding:0,避免地图本身不填充整个BrowserView。
内容的提问来源于stack exchange,提问作者Daniel Lip
相关产品推荐
相关产品推荐

