c# - 如何在使用 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 文件夹中的视图模型相同
解决方案
我相信您应该在初始化时向区域注册视图。试试下面的代码
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
在某个时间点被任何人填充。
这是我的理解。如果你觉得这有用,请告诉我谢谢。
推荐阅读
- reactjs - 修改全局状态时不会重新渲染 react easy-peasy 组件
- python - 我们可以将已经创建的 Django API 转换为 Lambda 函数吗?
- kubernetes - 错误:为 prometheus 适配器自定义指标生成指标查询时未请求资源名称
- database-design - TimescaleDB 和 Loopback4 Timestamp 数据类型兼容性
- python - 如何从 .xacro 文件中自动提取 xacro 属性并将其用于 ROS 的 python 脚本中
- swift - AWS S3 :- 重新启动应用程序时如何获取失败的 AWSS3TransferUtility 任务?
- firebase - 根据闭包上下文的要求,返回类型“LoginPage”不是“void”
- c# - 在多个页面中划分一个列表框 (Visual Studio C#)
- c# - C#在数组中搜索一系列值
- c# - 在 Excel 工作表上调整大小/移动 WinForms 控件