【问题标题】:WPF WebView2 Error - source property cannot be set to nullWPF WebView2 错误 - 源属性不能设置为 null
【发布时间】:2023-01-05 07:20:11
【问题描述】:

要对 API 服务进行身份验证,用户需要登录网页。如果登录有效,则身份验证代码将附加到重定向的 Uri 的末尾。然后在 oauth 中使用身份验证代码来获取密钥等......为了简化这一点,我已经实现了 WebView2:

        <wv2:WebView2 Name="webView"
                  Width="800"
                  Height="500"
                  Source="{Binding WebUri, Mode=TwoWay}">
        <i:Interaction.Triggers>
            <i:EventTrigger EventName="SourceChanged">
                <i:InvokeCommandAction Command="{Binding SourceChangedCommand}"/>
            </i:EventTrigger>
        </i:Interaction.Triggers>
    </wv2:WebView2>

我在视图模型中有验证逻辑来​​识别重定向 uri 何时包含身份验证代码;这是通过在 WebView 上引发 SourceChanged 事件时调用的 SourceChangedCommand 完成的(遵循 here 描述的导航事件生命周期)。 SourceChangedCommand.Execute如下:

    public void Execute(object? parameter)
    {
        if (ValidateUri(_viewModel.WebUri.ToString()))
        {
            var str = _viewModel.WebUri.ToString().Substring(50);
            _navigationService.Authenticate(str);
        }
    }

这是我遇到问题的地方:我还有一个 NavigationService,它在视图模型之间导航并通过数据模板等更改视图...当使用 WebView2 离开视图时(即:更改父视图上的数据上下文),出现以下错误:

Source 属性不能设置为 null

这非常令人困惑,因为 WebView2 的源实际上从未设置为 null - 它作为重定向的 Uri 进行维护。这里出了什么问题,我怎样才能离开这个视图?

我正在探索的可能解决方案是创建一个扩展 WebView2 的自定义控件,该控件具有映射到 WebView2.Dispose(bool) 的 bool 依赖属性 -> 如果为真,则将处理 webview。然而,这似乎有点矫枉过正,可能会引发与ObjectDisposedException's 相关的其他问题。

【问题讨论】:

标签: c# wpf webview2


【解决方案1】:

我遇到了同样的问题,发现这是因为我在绑定上设置了 IsAsync=true。

还要检查您绑定到的属性。他们总是需要能够获得一个不为空的值。

当我的属性被初始化时,我将它们设置为 new Uri("about:blank")。
此外,使用 this._myProp = new UriBuilder(value).Uri ??字段集上的 new Uri("about:blank") 以确保没有空值

嘿 Microsoft 一个带有 about:blank 的静态 Uri.Empty 属性怎么样?

我希望这有帮助

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-18
    • 2014-09-04
    • 2019-12-10
    • 1970-01-01
    • 2010-11-03
    • 1970-01-01
    • 2023-03-07
    相关资源
    最近更新 更多