我需要在基于Prism 4的Silverlight应用程序中的几个模块中使用样式.对此最好的方法是什么?
我们正在构建一个WPF Prism应用程序.我们有不同的开发人员在不同的模块项目上工作,并且多个模块被注入主Application Shell.主要应用程序也是一个单独的项目.我们还希望能够在不同的应用程序中使用这些模块.我们不希望在每个应用程序中命名具有相同名称的区域.
例如,假设我们有一个模块可用于两个不同的应用程序.在一个应用程序中,其开发人员可以将模块的区域命名为"DetailsRegion",而在另一个应用程序中,其开发人员可将其命名为"ResultsRegion".
我能找到的每个例子都通过硬编码模块类定义中的区域名称来注册View with the Region :
myRegionManager.RegisterViewWithRegion("RegionNameHere", GetType(ModuleViewType))
Run Code Online (Sandbox Code Playgroud)
我想要做的是将Region名称放在主应用程序的app.config文件中,并将此名称传递给模块.像这样的东西:
在主Shell应用程序的app.config中:
<Modules>
<SearchModule>
<add key="RegionName" value="SearchRegion" />
</SearchModule>
</Modules>
Run Code Online (Sandbox Code Playgroud)
在模块的类文件中:
Dim settings As NameValueCollection = CType(ConfigurationManager.GetSection("Modules/SearchModule"), NameValueCollection)
Dim regionName as string = settings("RegionName")
myRegionManager.RegisterViewWithRegion(regionName, GetType(SearchModuleType)
Run Code Online (Sandbox Code Playgroud)
在某种程度上,这将是完全将模块与shell和彼此分离的最后一步.
这在模块的视图中完美地工作.但我无法在模块的类定义文件中执行此操作,因为ConfigurationManager在该级别不可用.
我可以通过将区域名称放在模块的 app.config 的ApplicatonSettings部分来完成此操作.但这违背了能够将模块存储在一个位置以便由多个应用程序加载的目的.它确实需要在主应用程序的 app.config中.
有没有办法用区域注册模块的视图,而无需在代码中硬编码区域的名称?我们努力不要硬编码任何东西.这真的有必要吗?
在我的应用程序中,我在应用程序设置文件中写了一些值.当我使用棱镜时,我有一些模块和一个shell项目.安装完成后
情况1
当我没有将兼容模式设置为"以管理员身份运行"时.运行应用程序我可以为所有模块编写应用程序设置但无法为主shell项目编写.
案例:2
当我将兼容模式设置为"以管理员身份运行"时.现在我可以为所有人编写设置了.
所需解决方案
我想强制设置我的应用程序兼容模式作为管理员,但不知道如何做到这一点?
我正在研究Silverlight OOB应用程序的原型.为了模块化应用,将使用PRISM或MEF或两者.当新版本的应用程序可用时,CheckAndDownloadUpdateAsync可以帮助在OOB方案中下载最新版本.
如果只有新版本的应用程序模块可用,更新如何工作?是否有用于下载新模块的已知功能和/或策略?
我们使用的是Prism,是一个很好的组合和模块化框架.然而,我还没有看到关于Blendability with Prism组合的好故事.当你有一个包含Regions的代码时,你通常如何支持它的可混合性?
我看到一篇有趣的博客文章,它采用创建设计时引导程序,模块目录,容器的方法来支持这一点.
你有什么经历?PnP团队是否会围绕它提出更好的故事?(也就是说可能嵌入设计时间的bootstrapper,设计师时间区域经理在Prism里面)?
我正在尝试使用Ninject为模块化Silverlight应用程序工作.我可以尝试按照上面的链接并使其工作,但我想看看有人有更好的想法吗?
如何在ContextMenu中获取UserControl的原始DataContext.
下面的代码,你可以看到DataTemplate中有一个Button,它正确绑定.但是,在尝试绑定contextmenu的数据源时,我收到以下错误:
System.Windows.Data错误:4:不能用于与参照结合 '的RelativeSource FindAncestor,AncestorType =' System.Windows.Controls.TreeView找到源 'AncestorLevel = '1''.BindingExpression:路径= DataContext的; 的DataItem = NULL; target元素是'ContextMenu'(Name =''); target属性是'DataContext'(类型'Object')
我需要做什么才能让ContextMenu绑定到ViewModel?
================================================== =============================
ViewModel被分配给代码隐藏中视图的datacontext:
视图:
<TreeView ItemsSource="{Binding Clients}"
cmd:TreeViewSelect.Command="{Binding SelectionChangedCommand}"
cmd:TreeViewSelect.CommandParameter="{Binding RelativeSource={RelativeSource Self},Path=SelectedItem}">
<TreeView.ItemTemplate>
<DataTemplate>
<StackPanel>
<TextBlock Text="{Binding Name}">
<TextBlock.ContextMenu>
<ContextMenu DataContext="{Binding DataContext,
RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type TreeView}}}">
<MenuItem Header="{Binding TestString}" />
</ContextMenu>
</TextBlock.ContextMenu>
</TextBlock>
<Button DataContext="{Binding DataContext,
RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type TreeView}}}"
Content="{Binding TestString}" Command="{Binding EditSelectedClientCommand}" />
</StackPanel>
</DataTemplate>
</TreeView.ItemTemplate>
</TreeView>
Run Code Online (Sandbox Code Playgroud)
视图模型:
public class ClientListViewModel : ViewModelBase
{
public String TestString {
get { …Run Code Online (Sandbox Code Playgroud) 我对Prism相当新,我目前正在使用Prism作为概念证明项目重写我们现有的一个应用程序.
该应用程序使用MVVM和ViewModel第一种方法:我们的ViewModel由容器解析,IViewResolver服务计算出它应该连接到哪个视图(使用名称约定等).
此时代码(向选项卡控件添加视图)看起来像这样:
var vm = (get ViewModel from somewhere)
IRegion reg = _regionManager.Regions["MainRegion"];
var vw = _viewResolver.FromViewModel(vm); // Spins up a view and sets its DataContext
reg.Add(vw);
reg.Activate(vw);
Run Code Online (Sandbox Code Playgroud)
这一切都很好,但我真的很喜欢使用Prism导航框架为我做所有这些事情,这样我就可以这样做:
_regionManager.RequestNavigate(
"MainRegion",
new Uri("NameOfMyViewModel", UriKind.Relative)
);
Run Code Online (Sandbox Code Playgroud)
并让Prism旋转ViewModel + View,设置DataContext并将视图插入该区域.
通过创建引用ViewModel类型的DataTemplates,我获得了一些成功,例如:
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:Module01">
<DataTemplate DataType="{x:Type local:TestViewModel}">
<local:TestView />
</DataTemplate>
</ResourceDictionary>
Run Code Online (Sandbox Code Playgroud)
...并且在模块初始化时让模块将相关的资源字典添加到应用程序资源中,但这看起来有点垃圾.
有没有办法从Prism有效地接管视图创建,以便在RequestNavigate调用时我可以查看提供的内容Uri并根据它调整视图/视图模型?有一个重载RegionManager.RegisterViewWithRegion,需要一个代表,允许你自己提供一个视图,我想我是在经历这样的事情.
我想我可能需要提供自己的IRegionBehaviorFactory,但我不确定所涉及的是什么(或者即使我走在正确的道路上!).
任何帮助赞赏!
- 注意:最初发布在prism codeplex网站上
我正在寻找一个"最佳实践"(如果有一个最好的),干净地关闭使用MEF和PRISM4的WPF应用程序.最终,我正在寻找某种"关闭服务"来管理从Shell到所有想要验证关闭应用程序的viewmodel(或其他订阅者)的事件/命令.事件聚合器是最干净的方式吗?其他意见/选择?
理想情况下,我的ToolbarRegion中的ToolbarView上有一个按钮(我的Shell中的2个区域中的1个).这个按钮会在我的ToolbarViewModel上调用一个命令(在我的ToolbarControler上引用一个命令),这反过来会做两件事(我想?)......首先,通知所有订阅者它是关闭时间并允许他们中的任何一个取消关闭然后......如果没有取消,以某种方式通知shell关闭.我的应用程序的关闭模式设置为"ShutdownMode.OnMainWindowClose",因此如果Shell关闭,我应该全部设置.
有人可以帮我解决这个问题吗?
我正在使用反射器进入Microsoft.Practices.Prism程序集,并为DelagateCommand的构造函数遇到以下定义:
public DelegateCommand(Action executeMethod, Func<bool> canExecuteMethod)
: base(action, func)
{
Action<object> action = null;
Func<object, bool> func = null;
if (action == null)
{
action = o => executeMethod();
}
if (func == null)
{
func = o => canExecuteMethod();
}
if ((executeMethod == null) || (canExecuteMethod == null))
{
throw new ArgumentNullException(
"executeMethod",
Resources.DelegateCommandDelegatesCannotBeNull);
}
}
Run Code Online (Sandbox Code Playgroud)
此代码无法编译,因为它: base(action, func)指向ctor中的前两个变量.
是否有可能复制这种行为?也许是通过使用匿名方法?
提前感谢您的意见.
Reflector IL用于此方法:
.method public hidebysig specialname rtspecialname instance void .ctor(class [mscorlib]System.Action executeMethod, class [mscorlib]System.Func`1<bool> canExecuteMethod) cil …Run Code Online (Sandbox Code Playgroud) 我使用datatemplate使用PRISM 4发现来加载我的视图.我需要多次创建view/viewmodel而不是重用现有实例,因此我在资源中设置x:Shared = false但它只对viewmodel产生影响.我可以确认视图模型没有被重用,但视图是.视图构造函数仅在第一次调用时调用.我在这里看过类似的帖子,但他们的解决方案对我不起作用.我想知道我是否可以扩展资源加载器/定位器,并确保它尊重共享标志.
以下是我的模板的定义方式:
<DataTemplate DataType="{x:Type CVM:MyViewModel}" x:Shared="False">
<V:MyView />
</DataTemplate>
Run Code Online (Sandbox Code Playgroud)