使用 prism 时,模块中的控件使用的资源的正确位置在哪里?

发布于 2024-08-07 02:53:11 字数 149 浏览 3 评论 0 原文

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

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

Normally, all resources are put in app.xaml, or other resources xaml files (as resource dictionary) and then reference it in app.xaml.

When applying prism pattern, for those module, there is no app.xaml file. Application class is replaced by a class implementing interface IModule. So where is the right place for resources used by controls in the module?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

北方。的韩爷 2024-08-14 02:53:11

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

复合 WPF (Prism) 模块资源数据模板

this is how i do it: have modules register resources with the app.

Composite WPF (Prism) module resource data templates

霊感 2024-08-14 02:53:11

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

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

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...

You can add the resource dictionary in the same assembly as the module or in other loaded assembly, then access it programmatically by using the Application.GetResourceStream method; however you will need to know the name of the assembly where the resource is defined.

For example, if your assembly is named TheAssembly and the resource dictionary is named TheDictionary.xaml, you can do (Disposes not shown for brevity):

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);

From here, you can for example use the Unity container to make the resource dictionary available application-wide.

UPDATE

The following version avoids having to hard-code the assembly name, provided that the resource is in the currently executing assembly:

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...
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文