CefSharp与WPF MVVM

hiz5n14c  于 2023-06-07  发布在  其他
关注(0)|答案(1)|浏览(178)

我在我的项目中使用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)

fcy6dtqo

fcy6dtqo1#

您将不能这样做,因为事件是在工作线程上触发的,交互框架调用依赖属性来响应它,而这些属性不能从另一个非GUI线程调用。
手动处理视图中的事件,并直接执行需要执行的操作,即使只是调用VM中的命令。

相关问题