WPF通过ControlTemplate点击删除Butto DropShadowEffect

WPF Remove Butto DropShadowEffect on click by ControlTemplate

Button ControlTemplate 中,我需要访问 IsPressed 事件。我该怎么做?

背景:我在 Button Style 中添加了一个 DropShadowEffect 滴,但文本变得模糊。 This fix solved the blurry text issue. 然而,这增加了一个新问题。我想在用户单击按钮时删除 DropShadowEffect 。我想我会这样做;

<Style x:Key="DropShadowButtons" TargetType="Button">
<Setter Property="Template">
    <Setter.Value>
        <ControlTemplate TargetType="{x:Type Button}">
            <Grid>
                <Border Background="{TemplateBinding Background}">
                    <Border.Style>
                        <Style TargetType="{x:Type Border}">
                            <Setter Property="Border.Effect">
                                <Setter.Value>
                                    <DropShadowEffect Color="Black" Opacity="0.5" />
                                </Setter.Value>
                            </Setter>
                            <Style.Triggers>
                                <Trigger Property="Button.IsPressed" Value="False">
                                    <Setter Property="Border.Effect">
                                        <Setter.Value>
                                            <DropShadowEffect Color="Black" Direction="320" ShadowDepth="0" BlurRadius="0" Opacity="0" />
                                        </Setter.Value>
                                    </Setter>
                                </Trigger>
                            </Style.Triggers>
                        </Style>
                    </Border.Style>
                </Border>
                <Border Background="{TemplateBinding Background}">
                    <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" Margin="5,2,5,0"/>
                </Border>
            </Grid>
        </ControlTemplate>
    </Setter.Value>
</Setter>

然后发现 Button.IsPressed 不会因为成为 Border 的一部分而被解雇。那么ControlTemplate是如何访问Button的IsPressed事件的呢?

您只需要在 ControlTemplate 而不是 Border 的 Style 上触发。要使 Setter 以边框为目标,您需要为边框命名,并且需要为 Setter 指定目标名称:

<ControlTemplate TargetType="{x:Type Button}">
    <Grid>
        <Border x:Name="BackgroundBorder" Background="{TemplateBinding Background}">
            <Border.Style>
                <Style TargetType="{x:Type Border}">
                    <Setter Property="Border.Effect">
                        <Setter.Value>
                            <DropShadowEffect Color="Black" Opacity="0.5" />
                        </Setter.Value>
                    </Setter>
                </Style>
            </Border.Style>
        </Border>
        <Border Background="{TemplateBinding Background}">
            <ContentPresenter
                HorizontalAlignment="Center" 
                VerticalAlignment="Center" 
                Margin="5,2,5,0"
                />
        </Border>
    </Grid>
    <ControlTemplate.Triggers>
        <Trigger Property="IsPressed" Value="True">
            <Setter TargetName="BackgroundBorder" Property="Effect">
                <Setter.Value>
                    <DropShadowEffect 
                        Color="Black" 
                        Direction="320" 
                        ShadowDepth="0" 
                        BlurRadius="0" 
                        Opacity="0" 
                        />
                </Setter.Value>
            </Setter>
        </Trigger>
    </ControlTemplate.Triggers>        
</ControlTemplate>