You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MVVM模式下如何在ViewModel中订阅WebBrowser控件的Navigated事件?

解决WebBrowser Navigated事件在ViewModel中接收消息的问题

问题排查与修正步骤

  1. 修正事件参数类型
    WebBrowser的Navigated事件参数实际是NavigationEventArgs,不是你写的NavigatedArgs,这会导致事件处理方法无法正确绑定,先把后台代码的方法签名改对。

  2. 确保消息类定义正确
    消息类要保证是公共可访问的,属性能正确传递数据:

public class WebBrowserNavigatedMessage
{
    public string SourceUrl { get; set; }
}
  1. 正确实现后台事件发送消息
    修正后的后台事件处理代码:
private void WebBrowser_Navigated(object sender, NavigationEventArgs e)
{
    // 判空处理,避免导航到特殊Uri时Uri为null
    var sourceUrl = e.Uri?.ToString();
    var message = new WebBrowserNavigatedMessage { SourceUrl = sourceUrl };
    Messenger.Default.Send(message);
}
  1. ViewModel中正确注册与处理消息
    确保在ViewModel的构造函数中注册消息,并且ViewModel是当前View绑定的实例,同时记得在ViewModel销毁时注销注册避免内存泄漏:
public class YourViewModel : ViewModelBase
{
    public YourViewModel()
    {
        // 注册消息监听
        Messenger.Default.Register<WebBrowserNavigatedMessage>(this, HandleNavigatedMessage);
    }

    private void HandleNavigatedMessage(WebBrowserNavigatedMessage message)
    {
        // 在这里获取并处理导航后的源地址
        if (!string.IsNullOrEmpty(message.SourceUrl))
        {
            // 比如赋值给ViewModel的属性
            // CurrentUrl = message.SourceUrl;
        }
    }

    // 重写Cleanup方法注销注册,防止内存泄漏
    protected override void Cleanup()
    {
        Messenger.Default.Unregister<WebBrowserNavigatedMessage>(this);
        base.Cleanup();
    }
}

额外注意事项

  • 确认View的DataContext设置正确,绑定的是你注册消息的ViewModel实例,否则ViewModel根本收不到消息。
  • 如果使用MVVM Light新版本,建议改用WeakReferenceMessenger,它基于弱引用,能减少内存泄漏风险,用法和Messenger.Default类似。
  • 导航到本地文件或某些内部页面时,e.Uri可能为null,一定要做判空处理,避免空引用异常。

内容的提问来源于stack exchange,提问作者MrCoolAndroid

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 16:05:39