如何将全局样式设置为具有现有控件模板的XAML按钮

时间:2014-10-10 11:56:00

标签: wpf xaml templates styles controls

我正在尝试创建一个全局样式,以便当鼠标悬停在应用程序中的任何按钮上时,鼠标光标将变为手形。但是,我的按钮有自己的控件模板,使用IsMouseOver触发器,所以我的全局IsMouseOver触发器不起作用。有没有办法绕过这个而不必为每个按钮样式添加触发器的setter?

这是全球风格:

<Style TargetType="{x:Type Button}">
    <Style.Triggers>
        <Trigger Property="IsMouseOver" Value="True">
            <Setter Property="Cursor" Value="Hand"/>
        </Trigger>
    </Style.Triggers>
</Style>

这是一个按钮:

<Style x:Key="VideoVolumeButtonBaseStyle" TargetType="{x:Type Button}">
    <Setter Property="HorizontalContentAlignment" Value="Center"/>
    <Setter Property="VerticalContentAlignment" Value="Center"/>
    <Setter Property="Foreground" Value="{StaticResource DefaultColorBrush}"/>
    <Setter Property="Padding" Value="1"/>
    <Setter Property="Height" Value="27"/>
    <Setter Property="Width" Value="31"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type Button}">
                <Border x:Name="ContentBorder" CornerRadius="3" Background="Transparent" BorderBrush="Transparent" BorderThickness="2">
                    <StackPanel Orientation="Horizontal" HorizontalAlignment="Left">
                        <ContentPresenter Name="contentPresenter"  Content="{TemplateBinding Content}" VerticalAlignment="Center" HorizontalAlignment="Left"/>
                    </StackPanel>
                </Border>
                <ControlTemplate.Triggers>
                    <Trigger Property="IsDefaulted" Value="true"/>
                    <Trigger Property="IsMouseOver" Value="true">
                        <Setter Property="Foreground" Value="{StaticResource FocusedColorBrush}"/>
                    </Trigger>
                    <Trigger Property="IsPressed" Value="true">
                        <Setter Property="Foreground" Value="{StaticResource FocusedColorBrush}"/>
                        <Setter Property="Margin" Value="1,-2,0,0" TargetName="contentPresenter"/>
                    </Trigger>
                    <Trigger Property="IsEnabled" Value="false">
                        <Setter Property="Foreground" Value="{StaticResource DisabledColorBrush}"/>
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

1 个答案:

答案 0 :(得分:2)

您可以使用Style.BasedOn property将以后的Style作为全球Style的基础:

<Style x:Key="GlobalStyle" TargetType="{x:Type Button}">
    <Style.Triggers>
        <Trigger Property="IsMouseOver" Value="True">
            <Setter Property="Cursor" Value="Hand"/>
        </Trigger>
    </Style.Triggers>
</Style>

<Style x:Key="ButtonStyle" TargetType="{x:Type Button}" 
    BasedOn="{StaticResource GlobalStyle}">
    ...
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type Button}">
                ...
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

如果您不想为全局Style命名,只需将其基于此Style

<Style TargetType="{x:Type Button}" BasedOn="{StaticResource GlobalStyle}" />