2

我有一个 CustomControl 库,其控件定义如下:

<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfCustomControlLibrary1">

<SolidColorBrush x:Key="Test"
                 Color="Red" />

<Style TargetType="{x:Type local:CustomControl1}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type local:CustomControl1}">
                <Border Background="{StaticResource Test}" />
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

哪个工作正常。

但是,如果我将“StaticResource”更改为“DynamicResource”,红色不再拾取?

为什么是这样?

4

1 回答 1

2

您需要合并资源字典。将包含 CustomControl1 样式的 ResourceDictionary 引用添加到 App.xaml:

<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="/AssemblyName;component/PathToResourceDictionary"/>
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Application.Resources>

在应用程序实际运行之前加载 XAML 期间,将解析 StaticResource 并将其分配给属性。它只会被分配一次,并且对资源字典的任何更改都会被忽略。

DynamicResource 在加载期间将一个 Expression 对象分配给该属性,但直到运行时要求该 Expression 对象提供值时才实际查找该资源。这会延迟查找资源,直到在运行时需要它。一个很好的例子是对稍后在 XAML 中定义的资源的前向引用。另一个例子是直到运行时才存在的资源。如果源资源字典更改,它将更新目标。

希望这会有所帮助。

于 2015-01-11T18:45:52.557 回答