无法在ControlTemplate中起作用

时间:2012-03-28 19:48:28

标签: wpf controltemplate

我必须承认ControlTemplates的错综复杂的工作方式并不是我准备写的书。 :O)

无论如何,我已经写了一个自定义按钮(必须有thosuands)以满足客户的HMI(人机界面)的需求,当然我已经为它提供了一个ControlTemplate。

按钮始终显示黑色阴影,但现在我希望阴影在按钮变得“热”时改变颜色,就像鼠标悬停在按钮上一样(按钮类 - HmiToolbarButton - 支持一个名为“IsHot”的d属性。

这是(非工作)模板:

 <Style TargetType="{x:Type local:HmiToolbarButton}">
    <Setter Property="AutoSize" Value="False" />
    <Setter Property="HotBehaviorNormal" Value="True" />
    <Setter Property="HorizontalAlignment" Value="Center" />
    <Setter Property="BorderThickness" Value="0" />
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type local:HmiToolbarButton}">
                <Grid x:Name="_grd">
                    <Border 
                        Background="{TemplateBinding Background}"
                        BorderBrush="{TemplateBinding BorderBrush}"
                        BorderThickness="{TemplateBinding BorderThickness}"
                        >
                        <ContentPresenter x:Name="PART_CONTENT" />
                    </Border>
                    <local:ButtonHotDecorator IsHitTestVisible="False" IsChecked="{TemplateBinding IsChecked}" IsMouseOver="{TemplateBinding IsHot}" IsEnabled="{TemplateBinding HotBehaviorNormal}" />
                    <Grid.Effect>
                        <DropShadowEffect ShadowDepth="0" Opacity="0.9" BlurRadius="10" Color="{TemplateBinding DropShadowColor}" />
                    </Grid.Effect>
                </Grid>
                <ControlTemplate.Triggers>
                    <Trigger Property="IsHot" Value="True">
                        <Setter TargetName="_grd" Property="Effect">
                            <Setter.Value>
                                <!-- *** PROBLEM HERE *** -->
                                <DropShadowEffect 
                                    ShadowDepth="0" Opacity="0.9" BlurRadius="10" 
                                    Color="{TemplateBinding HotDropShadowColor}" 
                                    />
                            </Setter.Value>
                        </Setter>
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

黑色投影工作正常,但当我将鼠标移到按钮上时,我完全没有效果。我怀疑它是TemplateBinding无法正常工作,因为如果我将其更改为恒定颜色,效果会按预期显示。

任何提示都将不胜感激。

由于

1 个答案:

答案 0 :(得分:3)

有时,当TemplateBinding不直接位于模板本身内部时,它无法解析。在这里,你在Trigger里面的Setter里面的一个新的对象实例中使用它,所以这可能是问题所在。尝试使用RelativeSource代替Trigger中的那个:

<DropShadowEffect 
  ShadowDepth="0" Opacity="0.9" BlurRadius="10" 
  Color="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=HotDropShadowColor}" 
  />