首页 > 解决方案 > 如何在使用 Prism 7.2 的视图之间导航?

问题描述

我正在编写一个应用程序,我想在其中放置导航。此应用程序使用 WPF,我使用的是 Prism 7.2.0.1367。

所以我创建了 2 个视图:一个HomePage和一个ModeFileAttente视图。

我也在使用 MVVM 模式。

这是我的app.xaml.cs

public partial class App : PrismApplication
{
    protected override Window CreateShell()
    {
        return Container.Resolve<V.HomePage>();
    }

    protected override void RegisterTypes(IContainerRegistry containerRegistry)
    { 
        containerRegistry.RegisterDialog<V.HomePage, VM.HomePageViewModel>();
        containerRegistry.RegisterDialog<V.ModeFileAttente, VM.ModeFIleAttenteViewModel>();
    }

    protected override void ConfigureModuleCatalog(IModuleCatalog  moduleCatalog)
    {
        moduleCatalog.AddModule<Bootstrapper>();
    }
}

我的HomePage.xaml

<Window x:Class="TestWPF.View.HomePage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:prism="http://prismlibrary.com/"
    prism:ViewModelLocator.AutoWireViewModel="True"
    mc:Ignorable="d"
    Title="HomePage" Height="347.667" Width="664">
<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="277*"/>
        <ColumnDefinition Width="16*"/>
    </Grid.ColumnDefinitions>

    <DockPanel Grid.ColumnSpan="2" Margin="0,0,0.333,-0.333">
        <Button Padding="0" DockPanel.Dock="Left" Content="Mode normal" Command="{Binding ClickCommand}" CommandParameter="ModeFileAttente"/>
        <Button Padding="0" DockPanel.Dock="Right" Content="Mode tournois" HorizontalAlignment="Stretch"/>
    </DockPanel>
    <ContentControl prism:RegionManager.RegionName="ContentRegion" Margin="5"  />
  </Grid>
</Window>

这是视图模型:

class HomePageViewModel : BindableBase, IDialogAware, INotifyPropertyChanged
{   

    #region Private region
    private readonly IRegionManager _regionManager;

    public event Action<IDialogResult> RequestClose;
    #endregion

    public DelegateCommand<string> ClickCommand { get; private set; }



    public string Title => throw new NotImplementedException();

    public HomePageViewModel(IRegionManager regionManager)
    {
        _regionManager = regionManager;
        ClickCommand = new DelegateCommand<string>(ExecuteClickCommand);
    }

    private void ExecuteClickCommand(string path) {
        _regionManager.RequestNavigate("ContentRegion", "FileAttente");
    }

    public bool CanCloseDialog()
    {
        throw new NotImplementedException();
    }

    public void OnDialogClosed()
    {
        throw new NotImplementedException();
    }

    public void OnDialogOpened(IDialogParameters parameters)
    {
        throw new NotImplementedException();
    }
}

我也有一Bootstrapper堂课:

public class Bootstrapper : IModule
{
    public void OnInitialized(IContainerProvider containerProvider)
    {
    }

    public void RegisterTypes(IContainerRegistry containerRegistry)
    {
        containerRegistry.RegisterForNavigation<ModeFileAttente>();
    }
}

我的 MVVM 模式运行良好,但是当我想在“主页”和“ModeFileAttente”视图之间导航时,除了视图上的“System.Object”之外什么也没有发生。

我已经搜索了可能是什么问题,但我没有解决我的问题。

这个版本的棱镜还有人遇到这个错误吗?

PS:我的 2 视图位于“视图”文件夹中,与 ViewModel 文件夹中的视图模型相同

标签: c#wpfnavigationprism-7

解决方案


我相信您应该在初始化时向区域注册视图。试试下面的代码

public class Bootstrapper : IModule
{
     public void OnInitialized(IContainerProvider containerProvider)
     {
        _regionManager.RegisterViewWithRegion("RegionName", typeof(View));
        _regionManager.RegisterViewWithRegion("RegionName", typeof(View2));
     }
}

现在你可以使用

_regionManager.RequestNavigate("RegionName", "View"); 

或者

_regionManager.RequestNavigate("RegionName", "View2"); 

更新

如果我们使用 prism,那么应该有一个与之关联的依赖注入框架,MEF或者Unity对于我正在使用的项目,Prism.Unity.Wpf如果你正在使用,Unity那么你可以通过添加一个构造函数来要求你的依赖注入器注入 RegionManager,该构造函数将由IRegionManager如下所示

    readonly IRegionManager _regionManager;
    public Bootstrapper(IRegionManager regionManager)
    {
        _regionManager = regionManager;
    }

当您注入IRegionManager构造函数时Unity,知道始终提供相同的实例,因为它被维护,Unity因此无需担心在IRegionManager其他地方使用相同的实例。

当我们prism:RegionManager.RegionName="ContentRegion"在 XAML 中使用时,我们实际上是在保留一个占位符来表示Prism存在一个区域,该区域将VIEW在某个时间点被任何人填充。

这是我的理解。如果你觉得这有用,请告诉我谢谢。


推荐阅读