我必须承认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
无法正常工作,因为如果我将其更改为恒定颜色,效果会按预期显示。
任何提示都将不胜感激。
由于
答案 0 :(得分:3)
有时,当TemplateBinding不直接位于模板本身内部时,它无法解析。在这里,你在Trigger里面的Setter里面的一个新的对象实例中使用它,所以这可能是问题所在。尝试使用RelativeSource代替Trigger中的那个:
<DropShadowEffect
ShadowDepth="0" Opacity="0.9" BlurRadius="10"
Color="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=HotDropShadowColor}"
/>