Prism Region注册父子区域 子区域初始化导航没生效解决

使用 INavigationAware 接口

cs 复制代码
public class HomeMainViewModel : ViewModelBase, INavigationAware
{
    private readonly IRegionManager _regionManager;
    private bool _isFirstNavigation = true;
    
    public HomeMainViewModel(IRegionManager regionManager)
    {
        _regionManager = regionManager;
        
        // 初始化命令
        NavigateHomeCommand = new DelegateCommand(() => 
            NavigateToSidebar(nameof(HomeView)));         
    }
    
    public void OnNavigatedTo(NavigationContext navigationContext)
    {
        // 此时所有区域都已注册完成
        if (_isFirstNavigation)
        {
            NavigateToSidebar(nameof(HomeView));
            _isFirstNavigation = false;
        }
    }
    
    public bool IsNavigationTarget(NavigationContext navigationContext) => true;
    
    public void OnNavigatedFrom(NavigationContext navigationContext) { }
    
    private void NavigateToSidebar(string viewName)
    {
        if (_regionManager.Regions.ContainsRegionWithName(RegionNames.SidebarRegion))
        {
            _regionManager.RequestNavigate(RegionNames.SidebarRegion, viewName);
        }
        else
        {
            System.Diagnostics.Debug.WriteLine($"SidebarRegion 未找到,无法导航到 {viewName}");
        }
    }
}

如果还是不行 接下来 可以这样

cs 复制代码
      public void OnNavigatedTo(NavigationContext navigationContext)
      {
          Task.Delay(100).ContinueWith(t =>
          {
              if (_regionManager.Regions.ContainsRegionWithName(RegionNames.SidebarRegion))
              {
                  _regionManager.RequestNavigate(RegionNames.SidebarRegion, nameof(HomeView));
              }
              else
              {
                  // 如果100ms后还没有,可以再等待
                  System.Diagnostics.Debug.WriteLine("SidebarRegion 仍未注册,可能需要更长时间等待");
              }
          }, TaskScheduler.FromCurrentSynchronizationContext());
      }

如果你的UI加载慢 那么可以这样

cs 复制代码
public async void OnNavigatedTo(NavigationContext navigationContext)
{
    // 等待一小段时间,确保所有UI元素都已加载
    await Task.Delay(10);
    
    if (_regionManager.Regions.ContainsRegionWithName(RegionNames.SidebarRegion))
    {
        _regionManager.RequestNavigate(RegionNames.SidebarRegion, nameof(HomeView));
    }
    else
    {
        // 如果10ms后还没有,尝试50ms
        await Task.Delay(40);
        if (_regionManager.Regions.ContainsRegionWithName(RegionNames.SidebarRegion))
        {
            _regionManager.RequestNavigate(RegionNames.SidebarRegion, nameof(HomeView));
        }
    }
}
相关推荐
小bo波9 小时前
从"任意文件复制"深挖Java I/O:字符流与字节流的本质抉择
java·nio·io流·后端开发·文件复制
nanxun8861 天前
记一次诡异的 Docker 容器"串包"故障排查
java
用户1563068103511 天前
Day01 | Java 基础(Java SE)
java
行者全栈架构师2 天前
Maven dependency:tree 的 8 个高级用法
java·后端
行者全栈架构师2 天前
IDEA 中 Maven 项目的 15 个红色报错快速解决方法
java·后端
令人头秃的代码0_02 天前
mac(m5)平台编译openjdk
java
唐青枫3 天前
Java JDBC 实战指南:从 Connection 到事务和连接池
java
一个做软件开发的牛马3 天前
MyBatis-Plus 从零实战:完整搭建可运行 Demo,BaseMapper 零 SQL、Wrapper 条件构造、分页插件与代码生成器详解
java·后端
用户3721574261353 天前
Java 处理 PDF 图片:提取 PDF 中的图片,并压缩 PDF 图片体积
java
用户3721574261353 天前
Java 打印 Word 文档:从基础打印到高级设置
java