如何使用触发器定位效果?

时间:2017-12-02 20:01:46

标签: c# wpf xaml

在我的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属性,但如果我尝试添加动画,这种方法就会崩溃。

1 个答案:

答案 0 :(得分:0)

实际上有点烦人;你不能给Setter一条路。即使这里的任何东西都有一个名为DropShadowEffect的属性,你也无法达到它。你可以使用动画,但这更详细,我没有整晚。

你可以做的是旧Tag黑客。 Tag可以用于获取,它是一个依赖属性,所以当它的值发生变化时它会更新绑定。 Border.Tag初始化为零,设置者将其设置为5,DropShadowEffectBlurRadius绑定到它。

<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>