2010-03-21 31 views
7

Tôi có một phong cách Button:WPF Kiểu: làm thế nào để thay đổi GradientStop Màu trong Kích hoạt

<Style x:Key="ButtonStyle1" TargetType="{x:Type Button}"> 
    <Setter Property="Template"> 
    <Setter.Value> 
     <ControlTemplate TargetType="{x:Type Button}"> 
     <Grid> 
      <Path x:Name="path1" ... Data="...some data..."> 
      <Path.Fill> 
       <LinearGradientBrush EndPoint="0.5,-0.3" StartPoint="0.5,0.8"> 
       <GradientStop x:Name="gs1" Color="Green" Offset="0.44"/> 
       <GradientStop Color="Black" Offset="0.727"/> 
       </LinearGradientBrush> 
      </Path.Fill> 
      </Path>        
     <ContentPresenter ...properties... /> 
     </Grid> 

    <ControlTemplate.Triggers> 
     <Trigger Property="IsMouseOver" Value="True"> 
     <Setter TargetName="???" Property="Color" Value="Green"></Setter> 
     </Trigger> 
    </ControlTemplate.Triggers> 
    </ControlTemplate> 
</Setter.Value> 

Tôi muốn thay đổi màu của GradientStop với x: Name = "GS1" khi chuột nút trên, vì vậy tôi sử dụng Trình kích hoạt IsMouseOver. Làm cách nào để tôi có quyền truy cập vào Thuộc tính màu trong Trình kích hoạt? Tôi đã thử TargetName = "gs1" và TargetName = "path1.gs1" nhưng nó không hoạt động. Bất kỳ ý tưởng?

Trả lời

7

Hãy thử điều này:

<Style x:Key="ButtonStyle1" TargetType="{x:Type Button}"> 
     <Style.Resources> 
      <LinearGradientBrush x:Key="gs1" EndPoint="0.5,-0.3" StartPoint="0.5,0.8"> 
       <GradientStop Color="Green" Offset="0.44"/> 
       <GradientStop Color="Black" Offset="0.727"/> 
      </LinearGradientBrush> 
      <LinearGradientBrush x:Key="gs2" EndPoint="0.5,-0.3" StartPoint="0.5,0.8"> 
       <GradientStop Color="White" Offset="0.44"/> 
       <GradientStop Color="Black" Offset="0.727"/> 
      </LinearGradientBrush> 
     </Style.Resources> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type Button}"> 
        <Grid> 
         <Path x:Name="path1" ........... Fill="{StaticResource gs1}"> 
         </Path> 
         <ContentPresenter .........../> 
        </Grid> 

        <ControlTemplate.Triggers> 
         <Trigger Property="IsMouseOver" Value="True"> 
          <Setter TargetName="path1" Property="Fill" Value="{StaticResource gs2}"></Setter> 
         </Trigger> 
        </ControlTemplate.Triggers> 
       </ControlTemplate> 
      </Setter.Value> 

     </Setter> 
    </Style> 

nó sẽ làm việc cho bạn. Bạn cũng có thể sử dụng DataBinding, Khai báo một màu DependencyProperty trong mã, Liên kết nó với thuộc tính Color của GradientStop và cập nhật nó bất cứ khi nào bạn muốn.

2

Tôi nghĩ bạn sẽ phải thay toàn bộ cọ vẽ. Here is a good example tạo kiểu cho nút.

<ControlTemplate.Triggers> 
    <Trigger Property="IsMouseOver" Value="True"> 
     <Setter Property="Fill" TargetName="path1"> 
     <Setter.Value> 
      <LinearGradientBrush EndPoint="0.5,-0.3" StartPoint="0.5,0.8"> 
       <GradientStop Color="Black" Offset="0.44"/> 
       <GradientStop Color="Green" Offset="0.727"/> 
      </LinearGradientBrush> 
     </Setter.Value> 
     </Setter> 
    </Trigger> 
</ControlTemplate.Triggers> 
+0

Ngoài ra còn có một cách để lập chỉ mục các GradientStops trong XAML nhưng tôi không thể có được một ví dụ để làm việc ... một cái gì đó như , như được mô tả tại http://books.google.com/books?id=XWu70Oqz6RIC&lpg=PA38&ots=FMR-4o3veZ&dq=pro%20wpf%202008%20with%20c%23%20gradientstops&pg=PA770#v=onepage&q=gradientstops&f=false –

+0

bạn có thể làm điều đó trong mã, NP, và tôi khá chắc chắn bạn có thể làm điều đó với một hình ảnh động, nhưng tôi chưa bao giờ thấy bất kỳ lập chỉ mục làm việc trong xaml –

+1

Tôi đã sử dụng nó thành công để làm