TemplateBinding给出错误DependencyProperty.UnsetValue

时间:2013-11-26 09:55:53

标签: wpf templates styles

我很难理解{DependencyProperty.UnsetValue}为什么会发生,而且说实话它的确切含义。我有一个“借用代码”的案例,它在原始解决方案中运行得很好,但在我的项目中却没有。

有三种样式定义:

<Style TargetType="Button" BasedOn="{StaticResource {x:Type ButtonBase}}" />
<Style TargetType="c:DropDownButton" BasedOn="{StaticResource {x:Type ButtonBase}}" />
<Style TargetType="{x:Type ButtonBase}">
....
<Setter Property="Background" Value="{StaticResource ButtonBrush}" />
<Setter Property="Template">
    <Setter.Value>
        <ControlTemplate TargetType="ButtonBase">
            <Border x:Name="PART_border"
                    ....
                    Background="{TemplateBinding Background}"
                    Padding="{TemplateBinding Padding}">
                <ContentPresenter RecognizesAccessKey="True"
                                  VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
                                   orizontalAlignment="{TemplateBinding HorizontalContentAlignment}" />
            </Border>
        </ControlTemplate>
    </Setter.Value>
</Setter>

Background="{TemplateBinding Background}"给出错误,使用硬编码颜色按预期工作。
当我停用<!--<Setter Property="Background" Value="{StaticResource ButtonBrush}"/>-->时,也会发生异常,但只有之后,应用程序才会加载并且可见。这不是很奇怪吗?

我无法弄清楚为什么原始项目没有这个问题 解决方法是:wpf必须在应用样式之前找到画笔 在我的情况下,我在样式定义之前移动了使用的画笔 我理解上面的“奇怪行为”,因为wpf会在稍后的时间点应用画笔,因此会在稍后的时间点抛出异常。

1 个答案:

答案 0 :(得分:1)

如果您的画笔放在不同的资源字典中,它确实在编译时识别出您的应用程序中存在这样的键,但据我所知,无法保证何时应用该资源。

在这种情况下使用 DynamicResource 来解决问题。