我有一个 XAML 窗口,其中有一组绑定到对象的字符串,如下所示:
<Label Content="{StaticResource LabelUserName}" HorizontalAlignment="Right" Name="Label1" VerticalAlignment="Center" />
当我像这样定义 ResouceDictionary 时,此代码工作正常:
<Window.Resources>
<ResourceDictionary >
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="/Strings/Strings_en-US.xaml" />
</ResourceDictionary.MergedDictionaries>
<ObjectDataProvider x:Key="objLogon" ObjectType="{x:Type StarUtilities:Logon}" />
</ResourceDictionary>
</Window.Resources>
但是,我希望能够更改字符串的绑定位置,因此我创建了一个如下所示的模块:
Public Module LocalizationChooser
Public ReadOnly Property GetLocalization As Uri
Get
Return New Uri("/Strings/Strings_en-US.xaml", UriKind.Relative)
End Get
End Property
End Module
然后我决定尝试改变Source
到绑定字符串。但是,我尝试了以下方法,但没有任何效果:
<ResourceDictionary Source="{Binding Source={x:Static Member=StarUI:LocalizationChooser.GetLocalization}}" />
<ResourceDictionary Source="{x:Static Member=StarUI:LocalizationChooser.GetLocalization}" />
<ResourceDictionary Source="{Binding Source=StarUI:LocalizationChooser.GetLocalization}" />
<ResourceDictionary Source="{Binding Source=LocalizationChooser, Path=GetLocalization}" />
<ResourceDictionary Source="{Binding Source=StarUI:LocalizationChooser, Path=GetLocalization}" />
<ResourceDictionary Source="{Binding Source={x:Static Member=StarUI:LocalizationChooser.GetLocalization}, Path=GetLocalization}" />
<ResourceDictionary Source="{Binding Source={x:Static Member=StarUI:LocalizationChooser.GetLocalization}, Path=LocalizationChooser.GetLocalization}" />
<ResourceDictionary Source="{Binding Source={x:Static Member=StarUI:LocalizationChooser.GetLocalization}, Path=StarUI:LocalizationChooser.GetLocalization}" />
所有这些都会产生相同的错误:
“ResourceDictionary”引发了 ArgumentNullException:值不能为 null。
参数名称:项目
我该怎么做才能让它发挥作用?
我应该提到 StarUI 命名空间已经定义如下:
xmlns:StarUI="clr-namespace:StarUI"
EDIT:
我发现通过对模块所做的更改,如果我使用以下命令,我可以编译和运行代码:
<ResourceDictionary Source="{x:Static StarUI:LocalizationChooser.GetLocalization}" />
但是,我仍然没有设计时支持。由于模块返回一个不需要查找任何内容的静态项,有没有办法在这里获得设计时支持?如果没有,是否有办法在 XAML 中指定设计时的静态引用,然后为运行时指定动态引用?
EDIT 2:
我最终所做的是编写 XAML 指定Source
静态地然后将构造函数设置为“覆盖”它。由于具有相同名称的字典条目将根据最后添加的字典条目进行引用,因此我可以在运行时添加字典,但在设计时仍然有字典。
我使用以下内容来简单地本地化我的代码,包括设计时支持和启用语言的动态更改。
在我的 XAML 中我包括:
<Window.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary x:Name="LocalizationStrings" Source="/Strings/Strings_en-US.xaml" />
</ResourceDictionary.MergedDictionaries>
<ObjectDataProvider x:Key="objLogon" ObjectType="{x:Type StarUtilities:Logon}" />
</ResourceDictionary>
</Window.Resources>
在我的代码隐藏中:
Public Sub New()
' This call is required by the designer.
InitializeComponent()
' Add any initialization after the InitializeComponent() call.
Me.Resources.MergedDictionaries.Add(GetLocalization)
End Sub
GetLocation 位于公共模块中:
Public ReadOnly Property GetLocalization As ResourceDictionary
Get
Dim resourceLocalization As New ResourceDictionary
resourceLocalization.Source = New Uri("/Strings/Strings_zh-cn.xaml", UriKind.Relative)
Return resourceLocalization
End Get
End Property
我的 ResourceDictionary XAML 的示例是:
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:sys="clr-namespace:System;assembly=mscorlib">
<sys:String x:Key="ButtonLogon">Logon</sys:String>
<sys:String x:Key="ButtonCancel">Cancel</sys:String>
<sys:String x:Key="LabelUserName">User Name:</sys:String>
<sys:String x:Key="LabelPassword">Password:</sys:String>
<sys:String x:Key="LabelKey">Decryption Key:</sys:String>
</ResourceDictionary>
然后我只需通过以下方式访问语言字符串:
<Label Content="{DynamicResource LabelUserName}" Name="Label1" />
现在一切都很好!