2013-06-29 23 views
6

xamlでボタンのスタイルの背景色を変更しようとしています これは私の現在のアプローチですが、動作しません。デフォルトのホバー色は、私はあなたがこれを達成するためにコントロールテンプレートをオーバーライドする必要があると言う他のソリューションを見てきましたが、それらの解決策も思われたあなたにも境界線と内容を定義する必要がwpfボタンバックグラウンドホバーの色

<Style x:Key="AtStyle" TargetType="Button"> 
     <Setter Property="Background"> 
      <Setter.Value> 
       <SolidColorBrush Color="{StaticResource AtBlue}" /> 
      </Setter.Value> 
     </Setter> 
     <Setter Property="Foreground" Value="White" /> 
     <Setter Property="Padding" Value="12,6" /> 
     <Setter Property="BorderThickness" Value="0" /> 
     <Setter Property="FontSize" Value="18.667" /> 
     <Style.Triggers> 
      <Trigger Property="IsMouseOver" Value="True"> 
       <Setter Property="Background"> 
        <Setter.Value> 
         <SolidColorBrush Color="Red" /> 
        </Setter.Value> 
       </Setter> 
      </Trigger> 
     </Style.Triggers> 
    </Style> 

を使用されています不要。 Xamlでホバー状態を定義するための最小限のアプローチは何ですか?

答えて

1

のは、Aeroテーマのデフォルトボタンのスタイルのテンプレートを見てみましょう:あなたが見ることができるように

<ControlTemplate TargetType="{x:Type ButtonBase}"> 
    <theme:ButtonChrome Name="Chrome" 
      Background="{TemplateBinding Background}" 
      BorderBrush="{TemplateBinding BorderBrush}" 
      RenderDefaulted="{TemplateBinding Button.IsDefaulted}" 
      RenderMouseOver="{TemplateBinding IsMouseOver}" 
      RenderPressed="{TemplateBinding IsPressed}" 
      SnapsToDevicePixels="True"> 
     <ContentPresenter 
       Margin="{TemplateBinding Padding}" 
       SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" 
       VerticalAlignment="{TemplateBinding VerticalContentAlignment}" 
       HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" 
       RecognizesAccessKey="True"/> 
    </theme:ButtonChrome> 
    <ControlTemplate.Triggers> 
     <Trigger Property="IsKeyboardFocused" Value="True"> 
      <Setter TargetName="Chrome" Property="RenderDefaulted" Value="True"/> 
     </Trigger> 
     <Trigger Property="ToggleButton.IsChecked" Value="True"> 
      <Setter TargetName="Chrome" Property="RenderPressed" Value="True"/> 
     </Trigger> 
     <Trigger Property="IsEnabled" Value="False"> 
      <Setter Property="Foreground" Value="#ADADAD"/> 
     </Trigger> 
    </ControlTemplate.Triggers> 
</ControlTemplate> 

、マウスオーバーと色がButtonChromeのプロパティRenderMouseOverRenderPressedのバインディングのように定義されている押され。 ButtonChromeの方法は、Backgroundプロパティの値よりも優先されます。したがって、残念ながら、クリックまたは強調表示されたボタンの背景色をオーバーライドする唯一の方法は、そのテンプレートをオーバーライドすることです。

+1

あなたは、これは他のものよりも良い答えだと思うなぜこの例では、...動作しませんか?その人が働いています... –

+5

@Bondyeこの回答は「うまくいく」とは考えられていませんが、「なぜ」という質問に答えて、問題を完全に解決する方法を指示します。受け入れられた答えは「効果がありますが、非常に限定された数のケースでは、より複雑なものが必要な場合は役に立ちません。より詳細な分析は別の質問への私のコメントです。 TL; DR:単なるコピー・ペーストではありません。理解して自分でやってみてください。 – Athari

7

私は、あなたの条件に基づいて、シンプルなスタイルベースのボタンを作成している

XAML

<Style TargetType="Button"> 
    <Setter Property="Background" 
      Value="Blue" /> 
    <Setter Property="HorizontalAlignment" 
      Value="Center" /> 
    <Setter Property="VerticalAlignment" 
      Value="Center" /> 
    <Setter Property="Foreground" 
      Value="White" /> 
    <Setter Property="Template"> 
    <Setter.Value> 
     <ControlTemplate TargetType="{x:Type Button}"> 
     <Border x:Name="bg" 
       Background="{TemplateBinding Background}" 
       BorderThickness="2" 
       BorderBrush="White"> 
      <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalAlignment}" 
          VerticalAlignment="{TemplateBinding VerticalAlignment}" /> 
     </Border> 
     <ControlTemplate.Triggers> 
      <Trigger Property="IsMouseOver" 
        Value="True"> 
      <Setter Property="Background" 
        Value="Red" 
        TargetName="bg" /> 
      </Trigger> 
     </ControlTemplate.Triggers> 
     </ControlTemplate> 
    </Setter.Value> 
    </Setter> 
</Style> 
+0

このスタイルは単純すぎます。それはアクセスキーを壊す、それは無効状態をサポートしていない。 'ContentPresenter'のアラインメントプロパティはコンテンツのアラインメントプロパティを使用する必要があるので、間違っています。 – Athari

+0

@Athari:ご提案いただきありがとうございます。はい、それはシンプルになっています.Delegers for Disabledとkeyboardfocuesd状態を含める必要があります。 – Ravuthasamy

関連する問題