Change Button Image On Hover or Click

button, image, windows-8, windows-runtime, xaml

Solution

I ended up editing the ControlTemplate just to create and change the Border. But it could be used to change the image too.

    <Button Width="75" Height="75" ClickMode="Press">
        <Button.Template>
            <ControlTemplate TargetType="Button">
                <Border x:Name="RootElement" CornerRadius="10" BorderThickness="2">
                    <VisualStateManager.VisualStateGroups>
                        <VisualStateGroup x:Name="CommonStates">
                            <VisualStateGroup.Transitions>
                                <VisualTransition To="MouseOver" GeneratedDuration="0:0:0.1"/>
                                <VisualTransition To="Pressed" GeneratedDuration="0:0:0.1"/>
                            </VisualStateGroup.Transitions>
                            <VisualState x:Name="Normal" />
                            <VisualState x:Name="MouseOver">
                                <Storyboard>
                                    <ColorAnimation Storyboard.TargetName="BorderBrush" 
                                                    Storyboard.TargetProperty="Color" 
                                                    To="Yellow" />
                                </Storyboard>
                            </VisualState>
                            <VisualState x:Name="Pressed">
                                <Storyboard>
                                    <ColorAnimation Storyboard.TargetName="BorderBrush" 
                                                    Storyboard.TargetProperty="Color"
                                                    To="Black"/>
                                </Storyboard>
                            </VisualState>
                        </VisualStateGroup>
                    </VisualStateManager.VisualStateGroups>
                    <Border.BorderBrush>
                        <SolidColorBrush x:Name="BorderBrush" Color="White"/>
                    </Border.BorderBrush>
                    <Border.Background>
                        <ImageBrush ImageSource="ms-appx:/data/images/icons/skill_icon_0.png"/>
                    </Border.Background>
                </Border>
            </ControlTemplate>
        </Button.Template>
    </Button>

Problem

How do I change the background image of a Button on Hover and on Click? The Visual Studio's UI does not seem to provide any easy way of doing it. Currently the default behavior seems to replace my image with a solid color, which looks aweful. All I have so far is the Button base: ``` <Button Content="" Height="75" VerticalAlignment="Center" Width="75" HorizontalAlignment="Center" ClickMode="Press"> <Button.Background> <ImageBrush ImageSource="../data/images/icons/skill_icon_0.png"/> </Button.Background> </Button> ``` I tried to handle events and manually set it, but it doesn't work for Pressed/Released: ``` Button skillButton = new Button(); skillButton.Width = 75; skillButton.Height = 75; skillButton.ClickMode = ClickMode.Press; skillButton.Background = GetIconImage(iconIndex, 0); skillButton.PointerEntered += (object sender, Windows.UI.Xaml.Input.PointerEventArgs e) => { skillButton.Background = GetIconImage(iconIndex, 1); }; skillButton.PointerExited += (object sender, Windows.UI.Xaml.Input.PointerEventArgs e) => { skillButton.Background = GetIconImage(iconIndex, 0); }; skillButton.PointerPressed += (object sender, Windows.UI.Xaml.Input.PointerEventArgs e) => { skillButton.Background = GetIconImage(iconIndex, 2); }; skillButton.PointerReleased += (object sender, Windows.UI.Xaml.Input.PointerEventArgs e) => { if (skillButton.FocusState == FocusState.Pointer) skillButton.Background = GetIconImage(iconIndex, 1); else skillButton.Background = GetIconImage(iconIndex, 0); }; ```

Original source