使用棱镜时,模块中控件使用的资源在哪里?

时间:2009-10-13 15:13:29

标签: silverlight prism

通常,所有资源都放在app.xaml或其他资源xaml文件(作为资源字典)中,然后在app.xaml中引用它。

当应用棱镜模式时,对于那些模块,没有app.xaml文件。应用程序类由实现接口IModule的类替换。那么模块中控件使用的资源在哪里?

2 个答案:

答案 0 :(得分:2)

我是这样做的:让模块在应用程序中注册资源。

Composite WPF (Prism) module resource data templates

答案 1 :(得分:1)

您可以在与模块相同的程序集中或在其他已加载的程序集中添加资源字典,然后使用Application.GetResourceStream方法以编程方式访问它;但是,您需要知道定义资源的程序集的名称。

例如,如果您的程序集名为TheAssembly且资源字典名为TheDictionary.xaml,则可以执行(为简洁起见,未显示):

StreamResourceInfo sr = Application.GetResourceStream(
  new Uri("/TheAssembly;component/TheDictionary.xaml", UriKind.Relative));

StreamReader r=new StreamReader(sr.Stream);
string xaml=r.ReadToEnd();

ResourceDictionary rd = (ResourceDictionary)XamlReader.Load(xaml);

从这里开始,您可以使用Unity容器使应用程序范围内的资源字典可用。

<强>更新

以下版本避免了必须对程序集名称进行硬编码,前提是该资源位于当前正在执行的程序集中:

string assemblyName = Assembly.GetExecutingAssembly().FullName.Split(',')[0];
string uri = string.Format("/{0};component/Dictionary1.xaml", assemblyName);

StreamResourceInfo sr = Application.GetResourceStream(
  new Uri(uri, UriKind.Relative));

//etc...