WPF中是否有一种方法可以将资源使用限制为StaticResource?

时间:2019-12-20 09:05:03

标签: wpf

我有一个应用程序,它使用与ResourceDictionaries不同的翻译文本(lang.xaml,lang.en-GB.xaml等),该文本在我的App.xaml中定义如下:

<Application x:Class="AppName"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             StartupUri="MainWindow.xaml">
    <Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary x:Name="LangEngDictionary" Source="Resources/lang.xaml" />          
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Application.Resources>
</Application>

并且在ui中有一个用户可以更改当前UI语言的地方。问题是我必须使用

Text="{DynamicResource translated_field_label}" 

代替

Text="{StaticResource translated_field_label}"

,因为无法在运行时重新加载StaticResource。因此,在此类地方使用 StaticResource 时出现很多错误,输入时没有引起注意。 问题是:有没有办法限制使用某些ResourceDictionary作为StaticResource?

1 个答案:

答案 0 :(得分:1)

简而言之:否
StaticResource始终是static的事物,运行时不应更改对象。
[清晰编辑]-因为使用StaticResource来引用资源,所以目标属性是直接引用“目标资源”的对象,并且与“资源键”没有关联。
就是这样:

<TargetObject x:Key="ResourceKey"/>
... Property="{StaticResource ResourceKey}" ...

等于

var ResourceKey = new TargetObject();
MyObject.Property = ResourceKey;

因此,在第一次分配后,您不能再通过更改与资源字典中的键关联的引用对象来修改目标属性的引用对象。

因此,对于可能更改的资源,您应该使用DynamicResource


我曾经非常排斥使用DynamicResource-但最终我明白了:既然性能允许,为什么还要使用StaticResourceDynamicResource来打扰我?