我有一个WPF控件库,它正在添加到windows窗体应用程序中。我们希望允许控件是可本地化的,但是我不确定如何在不重复代码的情况下完全完成这一任务。这就是我现在要做的。
基本上,在windows应用程序中,在主应用程序启动之前,我正在实例化一个驻留在窗体应用程序中的App.xaml (包含我指向表单应用程序中的资源的链接)。这对于运行时来说是完美的。
但是,我的用户控件都有Content="{StaticResource SomeVariableName}",结果是空的。我可以通过在我的控制库中拥有一个与我的windows窗体应用程序中的app.xaml和适当的资源字典相匹配的方法来解决这个问题。但是,这是重复的代码。
我已经尝试过的东西都没有用:
Uri resourceLocater = new Uri("/WindowsFormsApplication3;component/app.xaml", UriKind.Relative);
那么,是否有任何方法允许此操作,并使设计时查看组件的默认值并避免重复?或者,在这种情况下,复制可以吗?如果我的第二个项目的子项目看起来还好(复制的App.xaml与构建复制的资源),我如何使它不寻找组件级的项目,而是一个文件级别的项目?
最后一个问题(如果需要的话,我可以单独发布),我刚刚注意到了。我的App.xaml是内置在代码中的,所以这不允许我动态地创建新的ResourceDictionaries。有办法这样做吗?
Final option...possibly是最好的吗?- 无论如何,我计划使用Andre van Heerwaarde的代码,那么我应该检查文件的存在并将其作为合并的资源动态添加吗?基本上,在我的用户控件中有一个链接到默认嵌入式App.xaml的ResourceDictionary。然后,让代码动态查找适当的本地化资源,这些资源可以是相对的文件路径吗?我在这里看到的唯一缺点是,在fly...which上不能更改默认设置,我甚至可以在指定的位置(使用某种约定)更改默认值,而不是使用内置的?
哦,我不想要嵌入式资源的原因是为了让最终用户能够在部署构建后添加/修改新的本地化资源。
我可以添加代码,如果它能帮助您更好地可视化这一点,请告诉我。
更新
我现在遇到了一个进一步的问题,造型,而不仅仅是本地化。
下面是其中一个控件上的一个内部按钮的示例:
<Button Style="{StaticResource GrayButton}"还有一些我试过/想过的:
这里有一个连接案例听起来像我正在寻找的东西,但是它并没有提供任何真正的解决方案。
我能想到的解决方案(除了top..which之外不起作用)可能会起作用(而且还没有尝试),对于我认为应该很简单的事情来说,似乎也有很多工作要做。但是,我可能能够在可以绑定到的控件中创建一些依赖属性,然后允许那些属性被将使用该控件的项目覆盖。正如我所说,对于一个非常简单的请求来说,这似乎是一项很大的工作:)。这样能行吗?更重要的是,是否有更好、更简单的解决方案?
发布于 2012-04-26 13:16:57
我曾经遇到过这个问题,我解决了这个问题,我删除了整个“参考资料是按规范字典中的键索引的对象”的内容。
我的意思是,简单的事实是,在一个项目中定义一个资源,并在另一个项目中引用它的“关键”,应该会让任何理智的人感到不安。我想要强大的引用。
解决此问题的解决方案是创建一个定制工具,将资源xaml文件转换为具有每个资源属性的静态类:
所以MyResources.xaml:
<ResourceDictionary>
<SolidColorBrush x:Key="LightBrush" ... />
<SolidColorBrush x:Key="DarkBrush" ... />
</ResourceDictionary>变成MyResources.xaml.cs
public static class MyResources {
static MyResources() {
// load the xaml file and assign values to static properties
}
public static SolidColorBrush LightBrush { get; set; }
public static SolidColorBrush DarkBrush { get; set; }
}对于引用资源,可以使用x:Static而不是StaticResource。
<Border
Fill="{x:Static MyResources.LightBrush}"
BorderBrush="{x:Static MyResources.DarkBrush}"
... />现在您获得了强大的引用、自动完成和资源编译时间检查。
发布于 2012-04-20 15:58:59
我也遇到了处理样式主题和可用静态资源的问题。所以,我创建了一个独立的库,基本上除了要使用的主题之外,什么都没有,就像您以前链接问题的合并资源一样。
然后,在Windows (.xaml)中,我只是引用了那个库,类似于
<Window x:Class="MyAppNamespace.MyView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" ... />
<Window.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<!-- Common base theme -->
<ResourceDictionary Source="pack://application:,,,/MyLibrary;component/Themes/MyMainThemeWrapper.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Window.Resources>
<Rest of XAML for the WPF window>
</Window>“组件”似乎是指给定的"MyLibrary“项目的根。在实际项目中,我创建了一个名为“主题”的子文件夹,因此源代码包括.;构成部分/主题/.
"MyMainThemeWrapper.xaml“非常类似于嵌套的合并资源字典,它从其他库中完美地看到了一切。
发布于 2012-04-25 20:11:49
这是我对你问题的部分解决办法。我没有尝试处理松散的资源,但我在WinForms和WPF之间共享资源方面取得了一些成功。
这里有一个简单的演示应用程序,名为WindowsFormsHost.7z
https://stackoverflow.com/questions/10039102
复制相似问题