2017-10-20 108 views
0

我正在使用Prism 6来构建具有多个不同模块的应用程序。这是一个简单的按钮菜单,每个按钮都将主要内容区域导航到不同的动态发现视图。不幸的是,我发现自己对主菜单按钮进行了硬编码,这显然不是我想要的。棱镜6导航和动态发现视图

我想要的是从所有已注册我的类别的视图列表中动态构建单选按钮的ItemsControl。但我不知道如何编写ViewModel属性,要求Prism提供这样的列表

此外,我希望保证我的整体方法是合理的。

为了说明,现在我已经有了几个功能显示,每个功能都在自己的模块中实现。

  • 一种用于显示来自摄像头的实时取景和捕获图像
  • 模块A用于浏览所俘获图像的一个库模块
  • 其他忽略为了简洁

以我主视图XAML,我在左边的DockPanel中有按钮,右边是一个区域(ContentControl“Main”)中的视图内容。这是XAML修剪了一下。

<DockPanel > 
    <Border MinWidth="50" 
      DockPanel.Dock="Left" 
      > 
     <StackPanel Orientation="Vertical"> 
      <StackPanel.Resources> 
       <Style TargetType="{x:Type RadioButton}" 
         BasedOn="{StaticResource CategoryButton}"> 
        <Setter Property="GroupName" Value="MainGroup"/> 
        <Setter Property="IsChecked"> 
         <Setter.Value> 
         <MultiBinding Converter="{StaticResource ObjectEqualsConverter}" Mode="OneWay"> 
          <Binding Path="DataContext.ActivePageName" 
            RelativeSource="{RelativeSource AncestorType={x:Type Window}}" /> 
          <Binding Path="CommandParameter" RelativeSource="{RelativeSource Self}" /> 
         </MultiBinding> 
         </Setter.Value> 
        </Setter> 
       </Style> 
      </StackPanel.Resources> 
      <RadioButton Command="{Binding NavigateCmd}" 
         CommandParameter="CaptureView" 
         Margin="5" Content="Capture" 
      /> 

      <RadioButton Command="{Binding NavigateCmd}" 
         CommandParameter="LibraryView" 
         Margin="5" Content="Explore" 
      /> 

     </StackPanel> 
    </Border> 

    <!-- 
    Content is in the region named "Main". Modules register their own page 
    views and we navigate this region to show them as the user clicks the 
    page buttons. 
    --> 
    <ContentControl x:Name="Page" 
        prism:RegionManager.RegionName="{x:Static ga:Regions.Main}" 
        /> 
</DockPanel> 

</Window> 

我的主视图模型

public class MainWindowVm : BaseVm 
{ 
    private readonly IRegionManager _regionManager; 
    private readonly IUnityContainer _container; 
    private readonly IModuleCatalog _catalog; 
    private readonly IEventAggregator _aggregator; 
    public MainWindowVm(
     IRegionManager rm, 
     IUnityContainer container, 
     IModuleCatalog catalog) 
    { 
     NavigateCmd = new Prism.Commands.DelegateCommand<string>(Navigate); 

     _regionManager = rm; 
     _container = container; 
     _catalog = catalog; 
    } 

    public string CurrentView => (string)_regionManager?.Regions[Regions.Main]?.ActiveViews?.FirstOrDefault()?.ToString() ?? ""; 
    public Prism.Commands.DelegateCommand<string> NavigateCmd { get; private set; } 
    public void Navigate(string path) 
    { 
     _regionManager.RequestNavigate(Regions.Main, path, NavigationCompleted); 
    } 



    private void NavigationCompleted(NavigationResult nr) 
    { 
     RaisePropertyChanged(""); 
    } 

    public string ActivePageName 
    { 
     get 
     { 
      // HACK: Currently I'm taking the fully qualified name of the 
      // current view (e.g. "MyCompany.LibraryModule.LibraryView") and just 
      // chopping off all namespaces to get the basic, unqualified 
      // view name (e.g. "LibraryView") which I am blithely assuming 
      // will perfectly match one of the Page buttons on the main 
      // window. This really needs to be improved and generalized... 

      var name = CurrentView; 
      var i = name.LastIndexOf('.'); 
      if (-1 != i) 
       name = name.Substring(i+1); 

      return name; 
     } 
    } 
}; 

我模块使用RegisterTypeForNavigation注册了自己的看法。例如:

public class LibraryModule : IModule 
{ 
    private readonly IRegionManager _regionManager; 
    private readonly IUnityContainer _container; 

    public LibraryModule(IRegionManager regionManager, IUnityContainer c) 
    { 
     _regionManager = regionManager; 
     _container = c; 
    } 

    public void Initialize() 
    { 
     _container.RegisterTypeForNavigation<LibraryView>(); 
    } 
} 

是否有一个简单的方法来实现这个给定我的设置。我是否应该使用其他一些注册/导航方法?

棱镜已彻底改变,所有样品似乎有点过时了,所以我感到茫然,不知道该做什么这里

回答

1

棱镜已经改变得这么厉害,所有样品似乎有点过时如此我不知道该怎么做

实际上,Prism for WPF在几年中并没有改变,所有的当前样本都是最新的。所以,不知道你是基于这个声明。

你在考虑这一切都是错误的。您正在注册您的观点,然后试图向Prism询问视图名称是什么。相反,实际发生的事情是,您正在向Prism讲述您的视图名称并进行相应的注册。你已经有了这些数据,你只需要把它存储在你可以要求的地方。您可能最好使用某种类型的ViewRegistrationService来管理哪些视图名称已注册,并将它们添加到您的ItemsControl可绑定到的集合中。该服务应该是一个单身人士。

+0

从这个人自己的答案,谢谢! 当我说它已经改变我正在说4.0到5.0到6.x.我意识到这是几年,但我是新来的,Pluralsight的介绍视频比6.x早很多。总之,我正在做很多追赶。 我的计划是通过搜索本地目录来演变此代码以发现我的模块(从而发现我的视图),在这种情况下,我不知道我提前做了什么。我猜想区域经理是那种“发现”服务,但我一定会接受你的建议并创建自己的。 – Joe