static_void
static_void

Reputation: 60

How to set a global style to XAML buttons that have exisiting control templates

I'm attempting to create a global style so that the mouse cursor will change to a hand when mouseover on any button in the app. However, my buttons have their own control templates that use the IsMouseOver trigger so my global IsMouseOver trigger isn't working. Is there any way to get around this without having to add the setter for the trigger to every button style?

Here is the global style:

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

And here is a button:

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

Upvotes: 2

Views: 2712

Answers (1)

Sheridan
Sheridan

Reputation: 69959

You can just use the Style.BasedOn property to base your later Styles on your global 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>

If you don't want to name your global Style, you can simply base it on this named Style:

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

Upvotes: 3

Related Questions