我正在为我的新项目使用WPF4和PRISM4.
有一个模块,里面有几个视图.DI完成统一.当我第一次从ViewA导航到ViewB时,会创建ViewB并调用其构造函数.但是当我第二次尝试导航到ViewB时,未创建ViewB,但重用了现有实例.
我正在使用IRegionManager.RequestNavigate进行导航.
我试图将TransientLifeTimeManager传递给RegisterType Unity方法,但无济于事.
有没有办法在每次导航时配置棱镜和/或统一来创建新视图?
谢谢.
如何从棱镜区域卸载视图?
我正在使用Shell中的Ribbon控件编写WPF Prism应用程序.功能区的"主页"选项卡包含一个区域,RibbonHomeTabRegion我的一个模块(称为ModuleA)将加载一个区域RibbonGroup.这很好.
当用户离开ModuleA时,RibbonGroup需要从中卸载RibbonHomeTabRegion.我不是用RibbonGroup另一种观点取代- 该地区应该是空的.
编辑:我已经重写了这部分问题:
当我尝试删除视图时,我收到一条错误消息"该区域不包含指定的视图".所以,我编写了以下代码来删除该区域中的任何视图:
// Get the regions views
var regionManager = ServiceLocator.Current.GetInstance<IRegionManager>();
var ribbonHomeTabRegion = regionManager.Regions["RibbonHomeTabRegion"];
var views = ribbonHomeTabRegion.Views;
// Unload the views
foreach (var view in views)
{
ribbonHomeTabRegion.Remove(view);
}
Run Code Online (Sandbox Code Playgroud)
我仍然得到同样的错误,这告诉我有一些非常基本的我做错了.
谁能指出我正确的方向?谢谢你的帮助.
Prismv4和MEF有点新鲜.
我浏览了快速入门并尝试将它们中的两个组合在一起,但我似乎无法让它工作.
首先,我有一个Bootstrapper来加载Shell Window.
public sealed class ClientBootstrapper : MefBootstrapper
{
protected override void ConfigureAggregateCatalog()
{
base.ConfigureAggregateCatalog();
//Add this assembly to export ModuleTracker (Shell is in this Assembly).
AggregateCatalog.Catalogs.Add(new AssemblyCatalog(Assembly.GetExecutingAssembly()));
}
protected override DependencyObject CreateShell()
{
return Container.GetExportedValue<Shell>();
}
protected override void InitializeShell()
{
base.InitializeShell();
Application.Current.MainWindow = (Window)Shell;
Application.Current.MainWindow.Show();
}
}
Run Code Online (Sandbox Code Playgroud)
这很好.弹出了Shell窗口,出现了一个很好的Hello World消息.然后我尝试在Shell窗口中创建一个Region,这样我就可以将View加载到该区域.我甚至没有把它用于甚至将它移动到外部组件上.
[ModuleExport(typeof(HelloWorldModule), InitializationMode = InitializationMode.OnDemand)]
public class HelloWorldModule : IModule
{
[Import(AllowRecomposition = true)]
private IRegionViewRegistry regionViewRegistry;
[ImportingConstructor()]
public HelloWorldModule(IRegionViewRegistry registry)
{
this.regionViewRegistry = registry;
}
public void …Run Code Online (Sandbox Code Playgroud) 我想继续使用WPF应用程序并转换我的win-form应用程序(转换为WPF)
目前有太多的东西要学习WPF才能得到很好的应用......
我找到了Prism:http: //msdn.microsoft.com/en-us/library/gg406140.aspx
而且我相信这可以成为一种捷径,通过简单地添加我的业务逻辑,我可以获得WPF的酷炫功能.
在我对WPF有更多经验之后,是否可以删除Prism并构建我自己的UI?
谢谢.
我正在使用prism 4创建一个应用程序silverlight 5,当我使用UnityBootstrapper运行引导程序时,我有下一个错误:
无法加载文件或程序集'System.Windows.Controls,Version = 2.0.5.0,Culture = neutral,PublicKeyToken = 31bf3856ad364e35'或其依赖项之一.该系统找不到指定的文件.
ConfigureRegionAdapterMappings方法中的此错误:
protected override RegionAdapterMappings ConfigureRegionAdapterMappings()
{
// Call base method
var mappings = base.ConfigureRegionAdapterMappings(); <-- I get the error here!
if (mappings == null) return null;
// Add custom mappings
// Set return value
return mappings;
}
Run Code Online (Sandbox Code Playgroud)
奇怪的是,如果我将我的项目更改为silverlight 4,那么它工作正常(?).请你帮助我好吗?
谢谢!
我有一个使用PRISM的WPF桌面应用程序,有12个模块不相互依赖,每次启动shell时,模块都已加载,重点是我想知道哪个模块最后加载所以我可以开始行动.我怎么能确定这个?
使用Prism 4时我遇到了未知问题.我们在MVVM模式中实现业务解决方案.为此,我用过
1. Microsoft.Expression.Interactions
2. System.Windows.Interactivity
3. GalaSoft.MvvmLight.Extras.WPF4
Run Code Online (Sandbox Code Playgroud)
用于Interaction.Triggers,CallMethodAction和EventToCommand.
<SWI:Interaction.Triggers>
<SWI:EventTrigger SourceObject="{Binding ElementName=txtName}" EventName="GotFocus">
<MEI:CallMethodAction TargetObject="{Binding Path=DataContext,ElementName=txtName}" MethodName="txtName_GotFocus"></MEI:CallMethodAction>
</SWI:EventTrigger>
<SWI:EventTrigger SourceObject="{Binding ElementName=txtName}" EventName="KeyUp">
<GMEWCMD:EventToCommand Command="{Binding Path=DataContext.cmdtxtNameKeyUpEvent,ElementName=txtName}" PassEventArgsToCommand="True">
</GMEWCMD:EventToCommand>
</SWI:EventTrigger>
</SWI:Interaction.Triggers>
Run Code Online (Sandbox Code Playgroud)
一切都工作正常,但现在我们要求整个系统松散地耦合我们选择棱镜4.我们已经实现了这一点,但上面的代码创建了以下问题如下.
无法加载文件或程序集"Microsoft.Expression.Interactions,PublicKeyToken = 31bf3856ad364e35"或其依赖项之一.该系统找不到指定的文件.
如果我评论上面的代码一切正常.我不知道是什么问题.PRISM 4不支持以上组件吗?
请帮助我们摆脱这个问题.
谢谢
在开发WPF MVVM(prism)应用程序之后,我想实现身份验证,就像基于ASP.NET表单的身份验证一样.我想限制用户进入需要授权的屏幕.如何在WPF应用程序中实现,因为我正在使用PRISM.
我正在尝试使用DataTemplate从我的ViewModels创建一个关于MVVM的菜单.基本上,我已经创建了几个类来存储有关我的Menu结构的信息.然后,我想要使用DataTemplate将菜单结构视为WPF菜单.
我有一个菜单服务,允许不同的组件在菜单中注册新的菜单和项目.这是我如何组织我的菜单信息(ViewModel)
我有以下类:MainMenuViewModel - 包含TopLevelMenuViewModelCollection(顶级菜单的集合)
TopLevelMenuViewModel - 包含MenuItemGroupViewModelCollection(菜单项组的集合),以及菜单"Text"的名称
MenuItemGroupViewModel - 包含MenuItemViewModelCollection(菜单项的集合)
MenuItemViewModel - 包含text,image uri,command,children MenuItemViewModels
我想要做的是将DataTemplate应用于以前的类,将它们转换为普通的菜单.
MainMenuViewModel - >菜单
TopLevelMenuViewModel - >带有标题集的MenuItems
MenuItemGroupViewModel - > Separator,后跟每个MenuItemViewModel的MenuItem
MenuItemViewModel - > MenuItem(HeirarchicalDataTemplate)
问题是我没有看到如何为MenuItemGroupViewModel生成多个MenuItem.Menu模板希望始终为每个项目创建一个ItemContainer,它是一个MenuItem.因此,我要么最终在MenuItem中使用我的MenuItems,这显然不起作用,或者根本不起作用.我已经尝试了几件事,仍然无法弄清楚如何让一个项目产生多个MenuItem.
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:--">
<!-- These data templates provide the views for the menu -->
<!-- MenuItemGroupView -->
<Style x:Key="MenuItemGroupStyle" TargetType="{x:Type MenuItem}">
<Setter Property="Header" Value="qqq" />
<!-- Now what? I don't want 1 item here..
I wanted this to start with a <separator /> and list the …Run Code Online (Sandbox Code Playgroud) 我们如何使用MEF容器在ViewModel中注入IRegionManager。我必须在ViewModel的Command委托中切换视图。这是我在做什么的简短描述。我有一个名为Product的实体,其列表显示在一个视图(ProductListView)中。在该视图中,用户可以选择产品,然后单击“编辑”按钮。这将切换视图并显示一个新的View(ProductEditView)。为了激活一个不同的视图,我需要引用IRegionManager像这样
public class ProductListVM : NotificationObject { //The Product List View Model
[Import]
public IRegionManager RegionManager { get; set; }
private void EditProduct() { //EditCommand fired from ProductListView
IRegion mainContentRegion = RegionManager.Regions["MainRegion"];
//Switch the View in "MainContent" region.
....
}
}
Run Code Online (Sandbox Code Playgroud)
上面的代码因RegionManager的NullReferenceException而失败。这似乎是合乎逻辑的,因为上述视图模型是由WPF通过Xaml中的DataContext属性构造的,并且DI不会起作用,因此它没有机会导入RegionManager实例。在这种情况下,我们如何解决IRegionManager。
我的问题是关于MVVM中的第一个"M",模型.我看到了如何实现模型的大量变化.有些只是POCO,没有业务逻辑,也没有持久性逻辑,其他包含一个或两个.
现在,在我们的应用程序中,我们在模型,视图和视图模型之间进行了适当的分离.这是我们当前的解决方案结构(它是一个WPF棱镜应用程序):
我们现在需要弄清楚如何对数据库执行CRUD并更新我们的模型.我喜欢保持模型非常简单,并且拥有包含业务逻辑的"服务"类库,并针对我们的数据访问类执行工作单元模式的想法.是否存在任何已知的问题,使模型保持愚蠢和无视业务逻辑/数据访问?这在MVVM中是不常见的?
我想知道我是不是通过在模型中放置一些逻辑来限制自己或使事情变得比它们需要的更复杂,例如,在给定参数的情况下从其内部加载模型.请注意,这将是一个大型应用程序.
我们的应用程序必须将模型保存到多个数据库.我们使用Unity作为我们服务的依赖注入容器.您如何建议我告诉服务使用哪种数据连接?Ctor,每个功能等?
有点在寻找建立类似结构的人,以及他们的经验/建议.
我正在尝试在WPF Prism Desktop应用程序中实现模式对话框.
从Prism指导我可以看到正确的方法应该是使用Interaction:
<i:Interaction.Triggers>
<prism:InteractionRequestTrigger
SourceObject="{Binding ConfirmCancelInteractionRequest}">
<prism:PopupChildWindowAction
ContentTemplate="{StaticResource ConfirmWindowTemplate}"/>
</prism:InteractionRequestTrigger>
</i:Interaction.Triggers>
Run Code Online (Sandbox Code Playgroud)
但是PopupChildWindowAction在桌面的Microsoft.Practices.Prism.Interactivity.DLL库中没有,只有Silverlight?
我可以谷歌在WPF(Prism)的Modal对话框的许多不同的实现,但只是想知道为什么这个功能从Prism桌面DLL丢失,并在Silverlight DLL中可用?我可以使用交互服务,但建议使用交互请求作为MVVM应用程序的更合适的方法.
我正在使用prism和MVVM开发一个wpf应用程序.
我有一个主shell,它有两个区域:菜单区域和主区域.
我正在尝试在菜单区域(包含MenuView)中实现一个BACK和FORWARD按钮,就像我们在任何浏览器中一样:假设我有5个视图:View1,View2,View3,View4,View5.
当我启动应用程序时,View1将显示在主区域中.目前,我希望禁用这些按钮.现在,我选择导航到View3:View3显示在主区域中,然后Back btn变为启用(前进btn保持禁用状态).然后,我导航到View2,它显示在主区域中.
现在,当我单击Back btn时,View 3将显示在Main Region中,并且Forward btn将变为启用状态.我单击Forward,显示Now View 2,并禁用Forward btn.
我尝试过使用导航日志,如以下链接所述:http: //msdn.microsoft.com/en-us/library/gg430861(v = pandp.40).aspx
但是没有成功,因为我做了他们在MenuViewModel中提到的内容,这是在整个应用程序生命周期中在菜单区域中显示的唯一视图(并且只有主区域切换视图).这就是为什么,OnNavigatedTo方法永远不会被调用,因为我从不直接使用MenuView,这导致navigationService始终为null.
重点是我想在MenuView中使用这些按钮 - 菜单区域中显示的唯一视图,用于所有应用程序生命周期.后退和前进按钮在主区域中的视图之间导航 - 来回.会建议您的建议.
prism-4 ×13
wpf ×9
c# ×7
prism ×5
mvvm ×4
mef ×1
persistence ×1
regions ×1
silverlight ×1
wpf-controls ×1
xaml ×1