当前位置: 首页 > 编程语言 > C#

如何在设计时使用棱镜模块中的资源字典?分享

时间:2023-04-11 01:19:57 C#

prism模块在设计时如何使用资源字典?我在silverlight应用程序中使用prism框架,在单独的XAP中有多个模块。我在我的shell项目中定义了一个资源字典。在我的模块中,我可以很好地使用资源,但由于模块在运行时加载之前与外壳分离,因此设计器不会显示或识别它们。有没有办法让模块在设计时知道我的资源,而无需在每个视图xaml中合并我的资源文件?我的资源文件在“公??共”项目中。我想我必须有一个设计时资源的解决方案。优点:它适用于任何基于模块(MEF、UNITY..)的应用程序。它适用于任何设计器(VisualStudio、Blend..)它不会创建同一ResourceDictionary的多个实例让我们考虑以下解决方案:您可以在MyApp.Common中定义画笔、隐式样式、模板等。使用我的SharedResourceDictionary将ResourceDictionary包含在所有项目中。在设计时,它将根据设计器加载ResourceDictionary,在运行时,ResourceDictionary只会在必要时加载。使用方法说明示例:包含App.xaml中的SharedResourceDictionary包含SharedResourceDictionary在内,设备无法找到一些共享资源,例如在MyApp.Module1/UserControl1.xaml中资源://////LoadsscopeofResourcesinstancetocurrent;LoadssingletonofResourcesinstance;///publicclassSharedResourceDictionary:ResourceDictionary{//////存储对加载的ResourceDictionary的弱引用,以确保ResourceDictionary不会被多次实例化///protectedstaticDictionarySharedResources=newDictionary();publicstringSharedSource{get{return_SharedSource;}set{if(_SharedSource!=value){_SharedSource=value;sharedSourceChanged();}}}私有字符串_SharedSource;privatevoidsharedSourceChanged(){//ResourceDictionary只会实例化一次ResourceDictionarysharedResourceDictionary;锁(SharedResources){WeakReferenceweakResourceDictionary=null;如果(SharedResources.ContainsKey(_SharedSource)){weakResourceDictionary=SharedResources[_SharedSource];}else{SharedResources.Add(_SharedSource,null);}if(weakResourceDictionary==null||!weakResourceDictionary.IsAlive)//加载ResourceDictionary或获取对退出的引用{sharedResourceDictionary=(ResourceDictionary)Application.LoadComponent(newUri(_SharedSource,UriKind.Relative));weakResourceDictionary=newWeakReference(sharedResourceDictionary);}else{sharedResourceDictionary=(ResourceDictionary)weakResourceDictionary.Target;}SharedResources[_SharedSource]=weakResourceDictionary;}if(Application.Current!=null){//如果在应用程序范围内定义了sharedResourceDictionary,则不要将其再次添加到当前范围if(containsResourceDictionary(Application.Current.Resources,sharedResourceDictionary)){return;}}this.MergedDictionaries.Add(sharedResourceDictionary);}privateboolcontainsResourceDictionary(ResourceDictionaryscope,ResourceDictionaryrs){foreach(varsubScopeinscope.MergedDiction白羊座){如果(subScope==rs)返回真;如果(包含资源字典(subScope,rs))返回真;}返回假;我找到了几个解决方案:1)当你创建一个模块项目时,把App.xaml留在项目中而不是删除它,并在那里实例化你的资源,就好像它是它自己的应用程序一样(你也可以添加一个新的Application类到项目)你已经删除了它)文件在你的模块被加载到shell中时被忽略,所以它基本上只在设计时工作。这在visualstudio和混合中效果很好,但如果你有很多模块,内存占用可能会成为一个问题。2)使用设计时资源。有关在此处进行设置的一些信息:http://adamkinney.com/blog/2010/05/04/design-time-resources-in-expression-blend-4-rc/。这仅提供混合支持,您的视图将在visualstudio中去除所有样式和格式。这对我来说并不理想,因为我喜欢在VisualStudio中处理UI的某些方面。似乎没有记录的方法来手动设置设计时资源。将资源从shell迁移到共享程序集并使设计人员工作正常的小经验指南基于阅读此类问题并在互联网上搜索相同/相似问题的一些想法。我写这篇文章主要是因为问题2(下面),它与这个问题有关,恕我直言。因此,我们拥有与Shell中所有样式和资源相同的设计。这会产生两个问题:XAML-Editor中的上下文帮助不可用(因此我们将所有样式迁移到共享程序集(资源)。要解决第一个问题,您需要按照Liero的建议进行操作,即为每个UserControl添加一个资源字典.我没试过他的SharedDictionary,但是正常的ResourceDictionary肯定带回了contexthelp,去掉了蓝色下划线。但是designer还是显示不正确。所以第二个问题。本文Tips中只描述了design在时机成熟时为设计师带来风格。基本上,您将名为DesignTimeResources.xaml的资源字典添加到包含对资源的引用的项目:然后将其移动到Properties文件夹。然后手动编辑项目文件,将这个文件的项目改为:MSBuild:CompileDesignertrue基本上就是当你添加设计时资源时Blend会生成的文件。VS无法创建它,尽管它可以很好地读取它。项目文件的编辑说你基本上不想发布这个文件。这里还有两个小问题,也许会对某人有所帮助。所以起初我只是在这个块中添加了新的ResourceDictionary,它要求我提供x:Key。我习惯于将资源直接添加到UserControl.Resources,我没有意识到为了合并另一个字典,你需要标志,通常你可以跳过它。所以它看起来像这样:如果您想为您的视图提供设计时数据,我建议您阅读这篇文章。它展示了如何使用Blend在应用程序的已发布版本中未包含的项目中创建设计时数据。希望能帮到你。以上就是C#学习教程:如何在设计时使用prism模块中的资源字典?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: