2009-07-26 23 views
11

phép nói rằng tôi có dưới đây:Làm thế nào để làm cho Style.Triggers kích hoạt một phong cách đặt tên khác nhau được áp dụng

<Style TargetType="{x:Type TextBox}"> 
    <Setter Property="BorderThickness" Value="1" /> 
    <Setter Property="BorderBrush" Value="Gray" /> 
    <Style.Triggers> 
     <Trigger Property="IsFocused" Value="true"> 
      <Setter Property="BorderBrush" Value="Green" /> 
      <Setter Property="BorderThickness" Value="2" /> 
     </Trigger> 
    </Style.Triggers> 
</Style> 

này hoạt động tốt và không có gì quá nhiều sai lầm là ở đây, nhưng nó là một trường hợp khá đơn giản . Chuyện gì xảy ra nếu tôi muốn có tình trạng phong cách IsFocused liệt kê như là một phong cách exsplicit làm thế nào để tham khảo phong cách như là phong cách IsFocused, tức là

<Style x:key="ActiveStyle" TargetType="{x:Type TextBox}"> 
    <Setter Property="BorderBrush" Value="Green" /> 
    <Setter Property="BorderThickness" Value="2" /> 
</Style> 

<Style TargetType="{x:Type TextBox}"> 
    <Setter Property="BorderThickness" Value="1" /> 
    <Setter Property="BorderBrush" Value="Gray" /> 
    <Style.Triggers> 
     <Trigger Property="IsFocused" Value="true"> 
      -- Here I want to reference ActiveStyle and not copy the copy the setters 
     </Trigger> 
    </Style.Triggers> 
</Style> 

Trả lời

11

Tôi không nghĩ rằng bạn có thể tuy nhiên, bạn có thể tái sử dụng một phong cách này cách:

<Style x:Key="ActiveStyle" TargetType="{x:Type TextBox}"> 
    <Style.Triggers> 
     <Trigger Property="IsFocused" Value="true"> 
      <Setter Property="BorderBrush" Value="Green" /> 
      <Setter Property="BorderThickness" Value="2" /> 
     </Trigger> 
    </Style.Triggers> 
</Style> 

<Style TargetType="{x:Type TextBox}" BasedOn="{StaticResource ActiveStyle}"> 
    <Setter Property="BorderThickness" Value="1" /> 
    <Setter Property="BorderBrush" Value="Gray" /> 
</Style> 

tôi không thấy một giải pháp :(

+0

Không lý tưởng Tôi đồng ý nhưng sẽ phải làm ơn cảm ơn – vdhant

7

WPF cung cấp một tài sản đặc biệt cho FrameworkElement.FocusVisualStyle này vì vậy, đi trước và gán mà :)

<TextBox FocusVisualStyle="{StaticResource ActiveStyle}" ..... 

Hoặc một cách khác sử dụng setters

<Style TargetType="{x:Type TextBox}"> 
<Setter Property="BorderThickness" Value="1" /> 
<Setter Property="BorderBrush" Value="Gray" />  
<Setter Property="FocusVisualStyle" > 
    <Setter.Value> 
    <Style x:key="ActiveStyle" TargetType="{x:Type TextBox}"> 
     <Setter Property="BorderBrush" Value="Green" /> 
     <Setter Property="BorderThickness" Value="2" /> 
    </Style> 
    </Setter.Value> 
    </Setter> 
</Style> 
6

chưa Có một cách thứ ba để làm điều này.

Tạo hai mẫu kiểm soát tên để kiểm soát của bạn:

<ControlTemplate x:Key="NotFocused" TargetType="{x:Type TextBox}"> 
    . . . 
</ControlTemplate> 

<ControlTemplate x:Key="Focused" TargetType="{x:Type TextBox}"> 
    . . . 
</ControlTemplate> 

Sau đó, bạn tạo ra một phong cách mặc định cho TextBox với trigger trong này:

<Style TargetType="{x:Type TextBox}"> 
    <Style.Triggers> 
     <Trigger Property="IsFocused" Value="True"> 
      <Setter Property="Template" Value="{StaticResource Focused}" /> 
     </Trigger> 
     <Trigger Property="IsFocused" Value="False"> 
      <Setter Property="Template" Value="{StaticResource NotFocused}" /> 
     </Trigger> 
    </Style.Triggers> 
</Style> 

Tony

+1

Điều này gây ra một ngoại lệ cho tôi: "Đối tượng kiểu không được phép ảnh hưởng đến thuộc tính Kiểu của đối tượng mà nó áp dụng." rõ ràng, làm thế nào một phong cách có thể thay đổi chính nó thành một số phong cách khác nhưng vẫn tiếp tục hoạt động? – svick

+0

Tôi có thể thề rằng tôi đã có một ví dụ về điều này trong đơn xin của tôi, nhưng tôi không thể tìm thấy nó ngay bây giờ. Tôi không nhớ rằng lỗi xảy ra trong sự phát triển của tôi, điều đó không có ý nghĩa gì cả. Tôi sẽ phải chơi với điều này đôi khi tôi có một vài phút để phụ tùng. –

+0

@svick: Tôi đã chỉnh sửa ví dụ của mình để bây giờ nó sử dụng mã hoạt động. Nó có thể không hoàn toàn liên quan đến câu hỏi ban đầu vì nó sử dụng mẫu điều khiển và kiểu mặc định. Nhưng điều này không hoạt động. –

Các vấn đề liên quan