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

WinForms中WebView2新窗口(尺寸、位置)参数设置方法咨询

解决WebView2 WinForms应用新窗口的宽高、位置设置问题

要自定义WebView2弹出新窗口的大小、位置,核心是通过NewWindowRequested事件拦截默认窗口,自行创建WinForms窗口并承载新的WebView2控件,同时解析窗口参数应用到新窗口。

步骤1:注册NewWindowRequested事件

在主窗口的WebView2初始化完成后,注册事件:

// 主窗口WebView2初始化完成时注册事件
webView2.CoreWebView2InitializationCompleted += (s, args) =>
{
    webView2.CoreWebView2.NewWindowRequested += CoreWebView2_NewWindowRequested;
};

步骤2:实现事件处理逻辑

在事件处理方法中,取消默认行为,创建自定义窗口并解析参数:

private void CoreWebView2_NewWindowRequested(object sender, CoreWebView2NewWindowRequestedEventArgs e)
{
    // 拦截默认弹出窗口
    e.Handled = true;

    // 创建自定义新窗口
    var newBrowserForm = new Form();
    newBrowserForm.Text = "新窗口";
    // 设置窗口图标(替换为你的图标资源)
    newBrowserForm.Icon = Properties.Resources.WebView2Icon;

    // 添加不可编辑的地址栏
    var addressBar = new TextBox();
    addressBar.Dock = DockStyle.Top;
    addressBar.ReadOnly = true;
    addressBar.Margin = new Padding(0);
    newBrowserForm.Controls.Add(addressBar);

    // 创建新的WebView2控件
    var newWebView = new WebView2();
    newWebView.Dock = DockStyle.Fill;
    newBrowserForm.Controls.Add(newWebView);

    // 解析window.open或target链接传入的窗口参数
    var windowFeatures = e.WindowFeatures;
    if (!string.IsNullOrWhiteSpace(windowFeatures))
    {
        var featurePairs = windowFeatures.Split(',')
            .Select(pair => pair.Split('='))
            .Where(p => p.Length == 2)
            .ToDictionary(kv => kv[0].Trim(), kv => kv[1].Trim());

        // 应用宽度参数
        if (featurePairs.TryGetValue("width", out var widthStr) && int.TryParse(widthStr, out int width))
        {
            newBrowserForm.Width = width;
        }

        // 应用高度参数
        if (featurePairs.TryGetValue("height", out var heightStr) && int.TryParse(heightStr, out int height))
        {
            newBrowserForm.Height = height;
        }

        // 应用左侧位置参数
        if (featurePairs.TryGetValue("left", out var leftStr) && int.TryParse(leftStr, out int left))
        {
            newBrowserForm.Left = left;
        }

        // 应用顶部位置参数
        if (featurePairs.TryGetValue("top", out var topStr) && int.TryParse(topStr, out int top))
        {
            newBrowserForm.Top = top;
        }
    }
    else
    {
        // 设置默认窗口大小和居中显示
        newBrowserForm.Size = new Size(800, 600);
        newBrowserForm.StartPosition = FormStartPosition.CenterScreen;
    }

    // 初始化新WebView2并导航到目标地址
    newWebView.CoreWebView2InitializationCompleted += (s, initArgs) =>
    {
        newWebView.CoreWebView2.Navigate(e.Uri);
        // 绑定地址栏更新事件
        newWebView.CoreWebView2.NavigationCompleted += (navSender, navArgs) =>
        {
            addressBar.Text = newWebView.CoreWebView2.Source;
        };
    };

    // 使用主WebView2的环境初始化新控件
    newWebView.EnsureCoreWebView2Async(((CoreWebView2)sender).Environment);

    // 显示自定义窗口
    newBrowserForm.Show();
}

关键说明

  • 拦截默认窗口:设置e.Handled = true阻止WebView2弹出默认窗口,完全由自己控制窗口样式和参数。
  • 参数解析:e.WindowFeatures包含window.open()第三个参数传入的属性(如width=800,height=600),拆分后即可应用到WinForms窗口。
  • 不可编辑地址栏:添加只读TextBox,绑定WebView2的NavigationCompleted事件同步显示当前地址。

内容的提问来源于stack exchange,提问作者DaveRus

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 07:17:12