You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

拖拽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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 23:48:13