我在我的项目中使用CefSharp WPF控件与MVVM模式.我曾try 在Chromium浏览器中显示外部URL.我使用了LoadingStateChanged事件来跟踪Chromium浏览器中的页面加载事件.我在侦听LoadingStateChanged事件时收到以下错误消息.你能帮我解决这个问题吗?

Error Message:

调用线程无法访问此对象,因为 斯莱德拥有它.

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(() =>
        {
        });
    }
}

Detailed Error Message:

System.InvalidOperationException HResult=0x80131509消息= 调用线程无法访问此对象,因为另一个线程 拥有它.来源=WindowsBase堆栈跟踪:位于 System.Windows.Threading.Dispatcher.VerifyAccess()位于 System.Windows.DependencyObject.GetValue(DependencyProperty DP)位于 System.Windows.Interactivity.TriggerBase.get_Actions()位于 System.Windows.Interactivity.TriggerBase.InvokeActions(Object 参数)位于 System.Windows.Interactivity.EventTriggerBase.OnEvent(EventArgs 事件参数)在 System.Windows.Interactivity.EventTriggerBase.OnEventImpl(Object 发送者,EventArgs EventArgs) CefSharp.Wpf.ChromiumWebBrowser.CefSharp.Internals.IWebBrowserInternal.SetLoadingStateChange(LoadingStateChangedEventArgs Args)位于 CefSharp.Internals.ClientAdapter.OnLoadingStateChange(ClientAdapter*, Scope_refptr*浏览器,布尔值isLoding,布尔值 CanGoBack,Boolean canGoForward)

推荐答案

您不能这样做,因为事件是在工作线程上触发的,交互框架调用依赖属性来响应它,而这些属性不能从另一个非GUI线程调用.

在您的视图中手动处理事件,并直接执行需要执行的操作,即使它只是在调用您的VM中的命令.

Csharp相关问答推荐

亚马逊Pinpoint C# SDK

Microsoft.AspNetCore.Mvc. Controller Base.用户:属性或索引器Controller Base.用户无法分配给--它是只读的

无法使用ternal- .net修复可空警告

我可以 suppress 规则CS 9035一次吗?

将修剪声明放入LINQ中

有没有一种方法可以在包含混合文本的标签中嵌入超链接?

如何忽略API JSON响应中的空字符串?

如何在WPF的树视图中显示一个对象的两个或多个属性,其中只有一个是分层项?

在C#中,将两个哈希集连接在一起的时间复杂度是多少?

HttpClient SendAsync与多线程环境中的ArchiveZip

我可以查看我们向应用程序洞察发送了多少数据吗?

在使用UserManager时,如何包含与其他实体的关系?

C#LINQ延迟执行和嵌套方法

从Base64转换为不同的字符串返回相同的结果

类/值和日期的泛型方法

如何使用.NET Aspire从Blazor应用程序与GRPC API通信?

如何在一次数据库调用中为ASP.NET核心身份用户加载角色

Azure函数正在返回值列表,但该列表在Chrome中显示为空

如果所有";async任务方法()";调用都返回Task.FromResult()-是否同步执行?

我可以阻止类型上的Object.ToString()吗?