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
相关产品推荐
相关产品推荐

