2013-06-29 45 views
6

Tôi đang cố gắng thay đổi màu nền của kiểu nút trong xaml khi di chuột Đây là cách tiếp cận hiện tại của tôi, nhưng nó không hoạt động. Màu di chuột mặc định đang được sử dụngNút màu nền của nút 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> 

Tôi đã nhìn thấy các giải pháp khác mà nói rằng bạn cần phải ghi đè các mẫu kiểm soát để đạt được điều này, nhưng những giải pháp cũng yêu cầu bạn xác định biên giới và nội dung cũng mà dường như không cần thiết. Cách tiếp cận tối thiểu để xác định trạng thái di chuột trong Xaml là gì?

Trả lời

1

Hãy nhìn vào các mẫu của các nút phong cách mặc định cho theme Aero: màu sắc

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

Như bạn có thể thấy, mouse-over và ép được định nghĩa là các ràng buộc về tài sản RenderMouseOverRenderPressed các 's ButtonChrome . Cách ButtonChrome được thiết kế, chúng được ưu tiên hơn bất kỳ giá trị nào từ thuộc tính Background. Do đó, rất tiếc, cách duy nhất để ghi đè màu nền của nút được nhấp hoặc được đánh dấu là ghi đè mẫu của nó.

+1

Ví dụ này không hoạt động ... Tại sao bạn nghĩ rằng đây là một câu trả lời tốt hơn so với cái kia nhỉ? Đó là một trong những hoạt động ... –

+5

@Bondye Câu trả lời này không phải là nghĩa vụ phải "làm việc", nó là nghĩa vụ phải trả lời câu hỏi "tại sao" và đưa ra hướng dẫn làm thế nào để giải quyết vấn đề hoàn toàn. Câu trả lời được chấp nhận "hoạt động", nhưng trong một số lượng rất hạn chế các trường hợp, và không hữu ích nếu bất cứ điều gì phức tạp hơn là cần thiết. Phân tích chi tiết hơn là trong nhận xét của tôi cho một câu hỏi khác. TL; DR: không chỉ sao chép-dán; cố gắng hiểu và tự mình làm. – Athari

7

Tôi đã tạo ra đơn giản theo phong cách nút dựa trên cơ sở yêu cầu của bạn,

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

Kiểu này quá đơn giản. Nó phá vỡ các khóa truy cập, nó thậm chí không hỗ trợ trạng thái vô hiệu hóa. Nó cũng sai, vì thuộc tính căn chỉnh trên 'ContentPresenter' nên sử dụng các thuộc tính căn chỉnh nội dung. – Athari

+0

@Athari: Cảm ơn bạn đã đề xuất của bạn, có nó là đơn giản. Họ cần phải bao gồm Triggers for Disabled và keyboardfocuesd. – Ravuthasamy