有人成功在 C#“Visual Studio”VSIX 扩展项目的 ToolWindow 中托管 WebView2 控件吗?

问题描述 投票:0回答:1

我有一个 Visual Studio VSIX 项目,当前使用基于 IE 的过时的

WebBrowser
控件。微软似乎不希望我们再使用该控件,因为他们已经弃用了它,甚至对它进行了一些更改,使其不再像以前那样显示。 GitHub 等现代网站也无法正确显示。但据我所知,他们还没有提供一个 working
WebView2
,不需要像
ToolWindow
控件那样将一大堆解决方法托管在
WebBrowser
控件中。

在任务管理器中,我看到 Visual Studio 2022 现在在内部使用许多 WebView2 控件,甚至可能在 VSIX 包中。但没有关于我们如何做到这一点的指导。

我只是想用新的

WebBrowser
控件替换我过时的
WebView2
控件,但我找到的所有文档似乎要么已经过时,要么极其复杂,要么只提到 WPF 应用程序,未托管在 VSIX 包中的 WPF
ToolWindow
UserControl
中。

我不想做任何比显示相当简单的 html 或 XML 数据更奇特的事情。创建 WebView2 控件的团队使其安装和使用变得极其复杂,并且没有任何具体内容来制作包含该控件的 Visual Studio 扩展。

那么,有人成功地做到了我所描述的吗?

wpf-controls visual-studio-2022 vsix webview2
1个回答
0
投票

我不知道从什么时候开始,但这绝对是可能的。这是一个最小的例子:

XAML:

<?xml version="1.0" encoding="utf-8"?>
<UserControl x:Class="MyNameSpace.MyToolWindowControl"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:Wpf="clr-namespace:Microsoft.Web.WebView2.Wpf;assembly=Microsoft.Web.WebView2.Wpf"
             >
    <Grid>
        <Wpf:WebView2 Name="webView"/>
    </Grid>
</UserControl>

CS:

using Microsoft.Web.WebView2.Core;
namespace MyNameSpace;

[Guid(PackageGuids.MyToolWindow)]
public class MyToolWindow : ToolWindowPane
{
    public MyToolWindow()
        : base(null)
    {
        Content = new MyToolWindowControl();
    }
}

public partial class MyToolWindowControl : UserControl, IComponentConnector
{
    public MyToolWindowControl()
    {
        InitializeComponent();

        ThreadHelper.JoinableTaskFactory.Run(async delegate{
            InitializeWebViewAsync();
        }); 
    }

    private async Task InitializeWebViewAsync()
    {
        // create webview2 environment and load the webview
        string webviewDirectory = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
        webviewDirectory = Path.Combine(webviewDirectory, "MyWebView2Directory");
        Directory.CreateDirectory(webviewDirectory);

        CoreWebView2Environment env = await CoreWebView2Environment.CreateAsync(null, webviewDirectory);
        
        // load the webview2
        await webView.EnsureCoreWebView2Async(env);

        webView.Source = new Uri("https://stackoverflow.com/");
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.