我在我的项目中使用CefSharp WPF控件,并使用MVVM模式。我尝试在Chromium浏览器中显示外部URL。我使用LoadingStateChanged事件来跟踪Chromium浏览器中的页面加载事件。我在侦听LoadingStateChanged事件时收到以下错误消息。你能帮我解决这个问题吗?
错误信息:
调用线程无法访问此对象,因为另一个线程拥有它。
HomeControl.xaml:
<wpf:ChromiumWebBrowser WebBrowser="{Binding WebBrowser, Mode=OneWayToSource}" Address="{Binding Address, Mode=OneWay}">
<i:Interaction.Triggers>
<i:EventTrigger EventName="LoadingStateChanged">
<i:InvokeCommandAction Command="{Binding Path=LoadingStateChangedCmd, Mode=OneWay}" />
</i:EventTrigger>
</i:Interaction.Triggers>
</wpf:ChromiumWebBrowser>
HomeViewModel.cs:
public ICommand LoadingStateChangedCmd { get; set; }
public HomeViewModel()
{
LoadingStateChangedCmd = new CommunityToolkitInput.RelayCommand<LoadingStateChangedEventArgs>(LoadingStateChanged);
}
public void LoadingStateChanged(LoadingStateChangedEventArgs args)
{
if (args.IsLoading == false)
{
Dispatcher.CurrentDispatcher.Invoke(() =>
{
});
}
}
详细错误信息:
System.InvalidOperationException HResult=0x80131509 Message=调用线程无法访问此对象,因为另一个线程拥有它。源=WindowsBase StackTrace:在系统。Windows。穿线调度员在系统中使用VerifyAccess()。Windows。DependencyObject。系统中的GetValue(DependencyProperty dp)。Windows。互动性。TriggerBase get_Actions()在系统中。Windows。互动性。TriggerBase系统中的InvokeActions(对象参数)。Windows。互动性。EventTriggerBase.系统上的OnEvent(EventArgs eventArgs)。Windows。互动性。EventTriggerBase. CefSharp上的OnEventImpl(Object sender,EventArgs eventArgs)。Wpf ChromiumWebBrowser. CefSharp内部。IWebBrowserInternal。在CefSharp设置LoadingStateChange(LoadingStateChangedEventArgs args)。内部。ClientAdapter。OnLoadingStateChange(ClientAdapter*,scoped_refptr* browser,Boolean isLoading,Boolean canGoBack,Boolean canGoForward)
1条答案
按热度按时间fcy6dtqo1#
您将不能这样做,因为事件是在工作线程上触发的,交互框架调用依赖属性来响应它,而这些属性不能从另一个非GUI线程调用。
手动处理视图中的事件,并直接执行需要执行的操作,即使只是调用VM中的命令。