WPFでボタンマウスオーバーの背景をどのように変更しますか?


93

このXAMLを使用してページにボタンがあります。

<Button Content="Button" HorizontalAlignment="Left" VerticalAlignment="Bottom" 
    Width="50" Height="50" HorizontalContentAlignment="Left" 
    BorderBrush="{x:Null}" Foreground="{x:Null}" Margin="50,0,0,0">
    <Button.Style>
        <Style TargetType="Button">
            <Setter Property="Background" Value="Green"/>
            <Style.Triggers>
                <Trigger Property="IsMouseOver" Value="True">
                    <Setter Property="Background" Value="Red"/>
                </Trigger>
            </Style.Triggers>
        </Style>
    </Button.Style>
</Button>

しかし、ボタンの上にマウスを置くと、ボタンの背景がデフォルトのウィンドウの灰色の背景に変わります。
どうしたの?

これは、マウスオーバー前後のボタン画像です:
前:
前
後:
後


ただし、イメージを開始しForward-48.png、IsMouseOverをトリガーして同じものに変更する必要がありForward-48.pngます。私は別の画像であなたのコードを使用しようとしています、そして私はすべてうまくいきました。
Anatoliy Nikolaev 2013

1
@anatoliy:動作しません。
Sepehr Mohammadi 2013

デフォルトの色は何ですか?ボタンの背景を変更しない/設定しない他の場所ですか?私はあなたのコードがうまく機能するようにしています。
Anatoliy Nikolaev 2013

回答:


173

のデフォルトのMouseOver動作を削除するには、Buttonを変更する必要がありますControlTemplateStyle定義を次のように変更すると、うまくいくはずです。

<Style TargetType="{x:Type Button}">
    <Setter Property="Background" Value="Green"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type Button}">
                <Border Background="{TemplateBinding Background}" BorderBrush="Black" BorderThickness="1">
                    <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
    <Style.Triggers>
        <Trigger Property="IsMouseOver" Value="True">
            <Setter Property="Background" Value="Red"/>
        </Trigger>
    </Style.Triggers>
</Style>

編集:それは数年遅れですが、実際にはそこにある境界線の内側に境界線ブラシを設定することができます。それが指摘されたのと同じですが、そうではなかったようです...


1
これは機能しますが、[ボーダー]ボタンは消えます!ボタンの周りに<Border BorderBrush = "DarkGray" BorderThickness = "1">要素を配置する必要がありました。
Venugopal M 2015

4
@CFこれの理由は、標準のButtonスタイルが内ControlTemplateにトリガーを持っているため、OPのStyleトリガーをオーバーライドするためです。
torvin

1
@torvinそれはとても逆のようです!ユーザー定義のトリガーをデフォルトのトリガーでオーバーライドする必要があるのはなぜですか?私は階層を理解しています。ControlTemplateはStyleの上にありますが、このような基本的な設定をオーバーライドするのがなぜそれほど難しいのか理解できません。
Fuselight 2015年

@Fuselight、ControlTemplate基本的に内部のトリガーは「Background色に応じて境界線をペイントします。マウスがボタンの上にある場合-代わりにこの色の境界線をペイントします '、スタイルでは、Background色にのみアクセスでき、下の境界線の色にはアクセスできません。ただし、WPFのスタイル設定には多くの要望が残されています...
torvin

これには、背景が透明な画像を使用するときに、ロールオーバー時に表示される青いボックスを削除するという追加の利点があります。私の場合は0に国境ので、セットBorderThicknessをしたくなかった
チャック・サベージ

20

これまでのすべての回答には、デフォルトのボタンの動作を完全に別のものに置き換えることが含まれます。ただし、IMHOは、XAML要素の既存のデフォルトテンプレートを編集することで気になる部分だけを変更できることを理解しておくことは有用で重要です。

WPFボタンのホバー効果を処理する場合、WPF Button要素の外観の変化は、プロパティに基づいており、最上位要素のおよびプロパティを設定するTriggerのデフォルトスタイルのによって引き起こされます。コントロールテンプレート内。要素の背景には、下にありますButtonIsMouseOverBackgroundBorderBrushBorderButtonBorderので、変更、要素の背景Button.Backgroundプロパティが見られることから、ホバー効果を妨げません。

少し努力すれば、独自のセッターでこの動作をオーバーライドできますが、影響を与える必要のある要素はテンプレート内にあり、独自のXAMLから直接アクセスできないため、そのアプローチは難しく、IMHOが過度に複雑になります。

別のオプションは、グラフィックをContentではButtonなく、Backgroundです。グラフィックに追加のコンテンツが必要な場合Gridは、コンテンツの最上位オブジェクトとしてそれらを組み合わせることができます。

ただし、文字通りホバー効果を完全に無効にするだけの場合(単に非表示にするのではなく)、Visual Studio XAMLデザイナーを使用できます。

  1. XAMLの編集中に、[ デザイン ]タブを選択します。
  2. では「デザイン」タブで、あなたが効果を無効にする]ボタンを見つけます。
  3. そのボタンを右クリックして、 「テンプレートの編集/コピーの編集...」。プロンプトで、新しいテンプレートリソースを配置する場所を選択します。これは何もしないように見えますが、実際には、デザイナーは指定した場所に新しいリソースを追加し、ボタン要素を変更して、それらのリソースをボタンテンプレートとして使用するスタイルを参照します。
  4. これで、そのスタイルを編集できます。最も簡単なのは、要素を削除またはコメントアウトする(例:Ctrl+ EC)こと<Trigger Property="IsMouseOver" Value="true">...</Trigger>です。もちろん、その時点で必要なテンプレートに変更を加えることができます。

完了すると、ボタンのスタイルは次のようになります。

<p:Style x:Key="FocusVisual">
  <Setter Property="Control.Template">
    <Setter.Value>
      <ControlTemplate>
        <Rectangle Margin="2" SnapsToDevicePixels="true" Stroke="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}" StrokeThickness="1" StrokeDashArray="1 2"/>
      </ControlTemplate>
    </Setter.Value>
  </Setter>
</p:Style>
<SolidColorBrush x:Key="Button.Static.Background" Color="#FFDDDDDD"/>
<SolidColorBrush x:Key="Button.Static.Border" Color="#FF707070"/>
<SolidColorBrush x:Key="Button.MouseOver.Background" Color="#FFBEE6FD"/>
<SolidColorBrush x:Key="Button.MouseOver.Border" Color="#FF3C7FB1"/>
<SolidColorBrush x:Key="Button.Pressed.Background" Color="#FFC4E5F6"/>
<SolidColorBrush x:Key="Button.Pressed.Border" Color="#FF2C628B"/>
<SolidColorBrush x:Key="Button.Disabled.Background" Color="#FFF4F4F4"/>
<SolidColorBrush x:Key="Button.Disabled.Border" Color="#FFADB2B5"/>
<SolidColorBrush x:Key="Button.Disabled.Foreground" Color="#FF838383"/>
<p:Style x:Key="ButtonStyle1" TargetType="{x:Type Button}">
  <Setter Property="FocusVisualStyle" Value="{StaticResource FocusVisual}"/>
  <Setter Property="Background" Value="{StaticResource Button.Static.Background}"/>
  <Setter Property="BorderBrush" Value="{StaticResource Button.Static.Border}"/>
  <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>
  <Setter Property="BorderThickness" Value="1"/>
  <Setter Property="HorizontalContentAlignment" Value="Center"/>
  <Setter Property="VerticalContentAlignment" Value="Center"/>
  <Setter Property="Padding" Value="1"/>
  <Setter Property="Template">
    <Setter.Value>
      <ControlTemplate TargetType="{x:Type Button}">
        <Border x:Name="border" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" SnapsToDevicePixels="true">
          <ContentPresenter x:Name="contentPresenter" Focusable="False" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
        </Border>
        <ControlTemplate.Triggers>
          <Trigger Property="IsDefaulted" Value="true">
            <Setter Property="BorderBrush" TargetName="border" Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}"/>
          </Trigger>
          <!--<Trigger Property="IsMouseOver" Value="true">
            <Setter Property="Background" TargetName="border" Value="{StaticResource Button.MouseOver.Background}"/>
            <Setter Property="BorderBrush" TargetName="border" Value="{StaticResource Button.MouseOver.Border}"/>
          </Trigger>-->
          <Trigger Property="IsPressed" Value="true">
            <Setter Property="Background" TargetName="border" Value="{StaticResource Button.Pressed.Background}"/>
            <Setter Property="BorderBrush" TargetName="border" Value="{StaticResource Button.Pressed.Border}"/>
          </Trigger>
          <Trigger Property="IsEnabled" Value="false">
            <Setter Property="Background" TargetName="border" Value="{StaticResource Button.Disabled.Background}"/>
            <Setter Property="BorderBrush" TargetName="border" Value="{StaticResource Button.Disabled.Border}"/>
            <Setter Property="TextElement.Foreground" TargetName="contentPresenter" Value="{StaticResource Button.Disabled.Foreground}"/>
          </Trigger>
        </ControlTemplate.Triggers>
      </ControlTemplate>
    </Setter.Value>
  </Setter>
</p:Style>

(注:p:実際のコードではXML名前空間の修飾を省略できます。ここでは、Stack Overflow XMLコードフォーマッターが<Style/>、XML名前空間の完全修飾名を持たない要素ます。)

他のボタンに同じスタイルを適用する場合は、ボタンを右クリックして[ テンプレートの編集/リソースの適用 ]を選択し、最初のボタンに追加したスタイルを選択します。XAMLの要素に既定のスタイルを適用する通常の手法を使用して、そのスタイルをすべてのボタンの既定のスタイルにすることもできます。


5
本当にありがとう。これは、ここでの唯一の許容答えである
ジャレド・ビーチ

13

これは私にはうまくいきました。

ボタンのスタイル

<Style x:Key="TransparentStyle" TargetType="{x:Type Button}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="Button">
                <Border>
                    <Border.Style>
                        <Style TargetType="{x:Type Border}">
                            <Style.Triggers>
                                <Trigger Property="IsMouseOver" Value="True">
                                    <Setter Property="Background" Value="DarkGoldenrod"/>
                                </Trigger>
                            </Style.Triggers>
                        </Style>
                    </Border.Style>
                    <Grid Background="Transparent">
                        <ContentPresenter></ContentPresenter>
                    </Grid>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

ボタン

<Button Style="{StaticResource TransparentStyle}" VerticalAlignment="Top" HorizontalAlignment="Right" Width="25" Height="25"
        Command="{Binding CloseWindow}">
    <Button.Content >
        <Grid Margin="0 0 0 0">
            <Path Data="M0,7 L10,17 M0,17 L10,7" Stroke="Blue" StrokeThickness="2" HorizontalAlignment="Center" Stretch="None" />
        </Grid>
    </Button.Content>
</Button>

ノート

  • ボタンは、ウィンドウを閉じるために使用されるボタンとよく似た小さな青い十字を表示します。
  • グリッドの背景を「透明」に設定することにより、ヒットテストが追加されます。つまり、マウスがボタンの上にある場合、それは機能します。このタグを省略すると、ボタンが点灯するのは、マウスがアイコン内のベクター線の1つにある場合のみです(これはあまり使用できません)。

1
これは素晴らしい答えですが、Strokeにカーソルを合わせるBorderだけでなく、にカーソルを合わせると色が変わるのはPathどうですか?
16

1
このx:Key="TransparentStyle"部分と使い方は私がそこに着くために重要でした...ありがとう!
nrod

6

私が使用してきたResourceDictionaryのボタンスタイルを共有したいだけです。スタイルトリガーでonHoverの背景を自由に変更できます。" ColorAnimation To = *ご希望のBG(つまり#FFCEF7A0)"。ボタンBGは、mouseOver状態の後、自動的に元のBGに戻ります。トランジションの速度を設定することもできます。

リソースディクショナリ

<Style x:Key="Flat_Button" TargetType="{x:Type Button}">
    <Setter Property="Width" Value="100"/>
    <Setter Property="Height" Value="50"/>
    <Setter Property="Margin" Value="2"/>
    <Setter Property="FontFamily" Value="Arial Narrow"/>
    <Setter Property="FontSize" Value="12px"/>
    <Setter Property="FontWeight" Value="Bold"/>
    <Setter Property="Cursor" Value="Hand"/>
    <Setter Property="Foreground">
        <Setter.Value>
            <SolidColorBrush Opacity="1" Color="White"/>
        </Setter.Value>
    </Setter>
    <Setter Property="Background" >
        <Setter.Value>
            <SolidColorBrush Opacity="1" Color="#28C2FF" />
        </Setter.Value>
    </Setter>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type Button}">

                <Border x:Name="border"
                         SnapsToDevicePixels="True"
                         BorderThickness="1"
                         Padding="4,2"
                         BorderBrush="Gray"
                         CornerRadius="3"
                         Background="{TemplateBinding Background}">
                    <Grid>
                        <ContentPresenter 
                        Margin="2"
                        HorizontalAlignment="Center"
                        VerticalAlignment="Center"
                        RecognizesAccessKey="True" />

                    </Grid>
                </Border>

            </ControlTemplate>
        </Setter.Value>
    </Setter>

    <Style.Triggers>
        <Trigger Property="IsMouseOver" Value="true">
            <Trigger.EnterActions>
                <BeginStoryboard>
                    <Storyboard>
                        <ColorAnimation To="#D2F898"
                                        Storyboard.TargetProperty="(Control.Background).(SolidColorBrush.Color)" 
                                        FillBehavior="HoldEnd" Duration="0:0:0.25" AutoReverse="False" RepeatBehavior="1x"/>
                    </Storyboard>
                </BeginStoryboard>
            </Trigger.EnterActions>

            <Trigger.ExitActions>
                <BeginStoryboard>
                    <Storyboard>
                        <ColorAnimation
                                            Storyboard.TargetProperty="(Control.Background).(SolidColorBrush.Color)" 
                                            FillBehavior="HoldEnd" Duration="0:0:0.25" AutoReverse="False" RepeatBehavior="1x"/>
                    </Storyboard>
                </BeginStoryboard>
            </Trigger.ExitActions>

        </Trigger>


    </Style.Triggers>
</Style>

あなたがしなければならないすべてはスタイルを呼び出すことです。

実装例

<Button Style="{StaticResource Flat_Button}" Height="Auto"Width="Auto">  
     <StackPanel>
     <TextBlock Text="SAVE" FontFamily="Arial" FontSize="10.667"/>
     </StackPanel>
</Button>

2

ControlTemplateを使用し、アニメーション効果を持つもう少し難しい答え(https://docs.microsoft.com/en-us/dotnet/framework/wpf/controls/customizing-the-appearance-of-an-existing-コントロール

リソースディクショナリで、次のようにボタンのコントロールテンプレートを定義します。

<ControlTemplate TargetType="Button" x:Key="testButtonTemplate2">
    <Border Name="RootElement">
        <Border.Background>
            <SolidColorBrush x:Name="BorderBrush" Color="Black"/>
        </Border.Background>

        <Grid Margin="4" >
            <Grid.Background>
                <SolidColorBrush x:Name="ButtonBackground" Color="Aquamarine"/>
            </Grid.Background>
            <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" Margin="4,5,4,4"/>
        </Grid>
        <VisualStateManager.VisualStateGroups>
            <VisualStateGroup x:Name="CommonStates">
                <VisualState x:Name="Normal"/>
                <VisualState x:Name="MouseOver">
                    <Storyboard>
                        <ColorAnimation Storyboard.TargetName="ButtonBackground" Storyboard.TargetProperty="Color" To="Red"/>
                    </Storyboard>
                </VisualState>
                <VisualState x:Name="Pressed">
                    <Storyboard>
                        <ColorAnimation Storyboard.TargetName="ButtonBackground" Storyboard.TargetProperty="Color" To="Red"/>
                    </Storyboard>
                </VisualState>
            </VisualStateGroup>
        </VisualStateManager.VisualStateGroups>
    </Border>
</ControlTemplate>

XAMLでは、次のようにボタンに上記のテンプレートを使用できます。

ボタンを定義する

<Button Template="{StaticResource testButtonTemplate2}" 
HorizontalAlignment="Center" VerticalAlignment="Center" 
Foreground="White">My button</Button>

それが役に立てば幸い


0

ボタンのスタイルを変更する場合

1つ目:リソーススタイルを定義する

<Window.Resources>

    <Style x:Key="OvergroundIn" TargetType="Button">

        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="Button">
                    <Grid Background="#FF16832F">
                        <ContentPresenter TextBlock.Foreground="White" TextBlock.TextAlignment="Center" Margin="0,8,0,0" ></ContentPresenter>
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>

        <Style.Triggers>
            <Trigger Property="IsMouseOver" Value="True">

                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="Button">
                            <Grid Background="#FF06731F">
                                <ContentPresenter TextBlock.Foreground="White" TextBlock.TextAlignment="Center" Margin="0,8,0,0" ></ContentPresenter>
                            </Grid>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>

            </Trigger>
        </Style.Triggers>

    </Style>

    <Style x:Key="OvergroundOut" TargetType="Button">

        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="Button">
                    <Grid Background="#FFF35E5E">
                        <ContentPresenter TextBlock.Foreground="White" TextBlock.TextAlignment="Center" Margin="0,8,0,0" ></ContentPresenter>
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>

        <Style.Triggers>
            <Trigger Property="IsMouseOver" Value="True">

                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="Button">
                            <Grid Background="#FFE34E4E">
                                <ContentPresenter TextBlock.Foreground="White" TextBlock.TextAlignment="Center" Margin="0,8,0,0" ></ContentPresenter>
                            </Grid>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>

            </Trigger>
        </Style.Triggers>

    </Style>


</Window.Resources>

2番目の定義ボタンコード

                           <Border Grid.Column="2" BorderBrush="LightGray" BorderThickness="2" CornerRadius="3" Margin="2,2,2,2"  >
                                <Button Name="btnFichar" BorderThickness="0" Click="BtnFichar_Click">
                                    <Button.Content>
                                        <Grid>
                                            <TextBlock Margin="0,7,0,7" TextAlignment="Center">Fichar</TextBlock> 
                                        </Grid>
                                    </Button.Content>
                                </Button>
                            </Border>

3番目のコードビハインド

    public void ShowStatus()
    {
        switch (((MainDto)this.DataContext).State)
        {
            case State.IN:
                this.btnFichar.BorderBrush = new SolidColorBrush(Color.FromRgb(243, 94, 94));
                this.btnFichar.Style = Resources["OvergroundIn"] as Style;
                this.btnFichar.Content = "Fichar Salida";
                break;

            case State.OUT:
                this.btnFichar.BorderBrush = new SolidColorBrush(Color.FromRgb(76, 106, 83));
                this.btnFichar.Style = Resources["OvergroundOut"] as Style;
                this.btnFichar.Content = "Fichar Entrada";
                break;

        }
    }
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.