ResourceDictionary 源绑定到模块(用于本地化)

2024-01-03

我有一个 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" />

现在一切都很好!


您需要从 StaticResource 切换到动态资源 http://msdn.microsoft.com/en-us/library/system.windows.dynamicresourceextension.aspx,因为您的资源无法立即可用。

但是您不能在 ResourceDictionary 属性上使用 Bindings,因为它不是从 DependencyObject 派生的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ResourceDictionary 源绑定到模块(用于本地化) 的相关文章

随机推荐