【发布时间】: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 相关的其他问题。
【问题讨论】:
-
您可以考虑在这里发布您的问题:WebView2 Feedback。