在我的WPF应用程序中,我正在为ComboBox编写自定义模板。当用户将鼠标悬停在组合框上时,我希望组合框获得高光阴影效果,所以我尝试编写这段代码:
<ControlTemplate TargetType="{x:Type ComboBox}">
<Border x:Name="templateRoot"
Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}"
CornerRadius="4" SnapsToDevicePixels="True">
<Grid SnapsToDevicePixels="True">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="0" MinWidth="{DynamicResource {x:Static SystemParameters.VerticalScrollBarWidthKey}}" />
</Grid.ColumnDefinitions>
<Border x:Name="Shadow"
Grid.Column="0" Grid.ColumnSpan="2"
Margin="-3"
Background="{DynamicResource L1Brush}">
<Border.Effect>
<DropShadowEffect x:Name="ShadowEffect"
BlurRadius="0" ShadowDepth="0" />
</Border.Effect>
</Border>
<!-- rest of the template -->
</Grid>
</Border>
<ControlTemplate.Triggers>
<!-- other triggers -->
<Trigger Property="IsMouseOver" Value="True">
<Setter TargetName="ShadowEffect" Property="DropShadowEffect.BlurRadius" Value="5" />
</Trigger>
<Trigger Property="IsFocused" Value="True">
<Setter TargetName="ShadowEffect" Property="DropShadowEffect.BlurRadius" Value="5" />
</Trigger>
<!-- other triggers -->
</ControlTemplate.Triggers>
</ControlTemplate>
但是,在运行时,它会引发错误,引用名称ShadowEffect
不存在。我该如何工作?如果我想为动画制作动画,我如何从故事板中引用ShadowEffect
?
我意识到我可以设置Border的整个Effect
属性,但如果我尝试添加动画,这种方法就会崩溃。
答案 0 :(得分:0)
实际上有点烦人;你不能给Setter
一条路。即使这里的任何东西都有一个名为DropShadowEffect
的属性,你也无法达到它。你可以使用动画,但这更详细,我没有整晚。
你可以做的是旧Tag
黑客。 Tag
可以用于获取,它是一个依赖属性,所以当它的值发生变化时它会更新绑定。 Border.Tag
初始化为零,设置者将其设置为5,DropShadowEffect
将BlurRadius
绑定到它。
<ControlTemplate TargetType="{x:Type ComboBox}" x:Key="ComboTemplate">
<Border x:Name="templateRoot"
Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}"
CornerRadius="4" SnapsToDevicePixels="True">
<Grid SnapsToDevicePixels="True">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="0" MinWidth="{DynamicResource {x:Static SystemParameters.VerticalScrollBarWidthKey}}" />
</Grid.ColumnDefinitions>
<Border
x:Name="Shadow"
Grid.Column="0"
Grid.ColumnSpan="2"
Margin="-3"
Background="{DynamicResource L1Brush}"
Tag="0"
>
<Border.Effect>
<DropShadowEffect
BlurRadius="{Binding Tag, RelativeSource={RelativeSource AncestorType=Border}}"
ShadowDepth="0"
/>
</Border.Effect>
</Border>
<!-- rest of the template -->
</Grid>
</Border>
<ControlTemplate.Triggers>
<!-- other triggers -->
<Trigger Property="IsMouseOver" Value="True">
<Setter TargetName="Shadow" Property="Tag" Value="5" />
</Trigger>
<Trigger Property="IsFocused" Value="True">
<Setter TargetName="Shadow" Property="Tag" Value="5" />
</Trigger>
<!-- other triggers -->
</ControlTemplate.Triggers>
</ControlTemplate>