我有一个正在添加到 Windows 窗体应用程序的 WPF 控件库。我们希望允许控件可本地化,但是我不确定如何在不复制代码的情况下完全实现这一点。这就是我现在正在做的事情。
基本上,在 windows 窗体应用程序中,在主应用程序启动之前,我正在实例化一个 App.xaml,它存在于表单应用程序中(包含指向我的资源的链接,这些资源也存在于表单应用程序中)。这非常适合运行时。
但是,我的用户控件都有Content="{StaticResource SomeVariableName}"
,最终是空白的。我可以通过在我的控件库中拥有一个 app.xaml 和适当的资源字典来解决这个问题,这些字典与我的 windows 窗体应用程序中的资源字典相匹配。但是,这是重复的代码。
我已经尝试过的事情无济于事:
- 从我的表单应用程序中实例化位于用户控件库中的 App.xaml。这不起作用,因为我的资源的 URI 正在寻找嵌入式资源,而不是我的本地资源字典(然后我可以简单地将资源文件从控件复制到构建时表单应用程序中的适当位置)。我可以在这里利用DeferableContent吗?不过,据我所知,关于这个属性以及它应该如何使用的在线信息并不多。
- 我想为 App 和字典使用后期构建,但是,据我所知,App 实例化是对已编译 App.xaml 的静态引用。因此,App.xaml 必须至少存在于表单中
- 我确实尝试使用移动 resourcedictionary.xaml 的后期构建复制 App.xaml。我认为重复的 app.xaml 是可以的,因为这是驱动力,您可能不想依赖控件中的一个(这会回过头来让您想知道是否应该在控件中使用 App.xaml全部?除非您想允许使用嵌入资源的默认值....)这也失败了,即使它被放置在 URI 应该指向的位置,它也找不到资源。反编译的代码指向
Uri resourceLocater = new Uri("/WindowsFormsApplication3;component/app.xaml", UriKind.Relative);
- 我确实尝试使用移动 resourcedictionary.xaml 的后期构建复制 App.xaml。我认为重复的 app.xaml 是可以的,因为这是驱动力,您可能不想依赖控件中的一个(这会回过头来让您想知道是否应该在控件中使用 App.xaml全部?除非您想允许使用嵌入资源的默认值....)这也失败了,即使它被放置在 URI 应该指向的位置,它也找不到资源。反编译的代码指向
那么,有什么方法可以让它工作并在设计时查看组件默认值并避免重复?或者,在这种情况下复制可以吗?如果我的第二个项目符号的子项似乎没问题(复制的 App.xaml 与构建复制的资源字典),我如何使它不查找组件级别的项,而是查找文件级别的项?
我刚刚注意到的最后一个问题(如有必要,我可以单独发布)。我的 App.xaml 已内置到代码中,因此无论如何我都无法即时创建新的 ResourceDictionaries。有没有办法做到这一点?
最后的选择......可能是最好的选择? -无论如何我都打算使用 Andre van Heerwaarde 的代码,所以我应该只检查文件是否存在并将其作为合并资源即时添加吗?基本上,在我的用户控件中有一个 App.xaml 链接到默认的嵌入式 ResourceDictionary。然后,让代码动态查找适当的本地化资源,这些资源可以是相对文件路径吗?我在这里看到的唯一缺点是无法动态更改默认值......我什至可以在指定的地方(使用某种约定)看到它并且比内置的更喜欢?
哦,我不想要嵌入式资源的原因是最终用户可以在构建部署后添加/修改新的本地化资源。
如果它可以帮助您更好地可视化这一点,我可以添加代码,请告诉我。
更新
我现在在样式方面遇到了进一步的问题,而不仅仅是本地化。
以下是其中一个控件上的一个内部按钮的示例:
<Button Style="{StaticResource GrayButton}"
我尝试/想到的更多事情:
- 由于库项目中不允许使用 ApplicationDefinitions,因此我无法使用设置的 ResourceDictionary 创建 app.xaml(永远不会使用)。我可以将它嵌入到控件的资源中,但是它总是优先于任何应用程序级别的资源,并且我失去了可定制性。
这是一个实际上听起来像我正在寻找的连接案例,但是它没有为此提供任何真正的解决方案
我能想到的解决方案(超出顶部......不起作用)可能会起作用(并且尚未尝试)对于我认为应该简单的事情来说似乎也需要做很多工作。但是,我可能能够在控件中创建一些可以绑定到的依赖属性,然后允许将使用该控件的项目覆盖这些属性。正如我所说,对于一个非常简单的请求来说,这似乎需要做很多工作:)。这甚至会起作用吗?更重要的是,我是否缺少更好、更简单的解决方案?