2012-01-04 25 views
6

Trong một trong các dự án của tôi, tôi đã kế thừa một ListView và ghi đè kiểu bằng cách đặt mẫu điều khiển mới. Tôi cũng đã ghi đè kiểu tiêu đề cột. Cho đến nay tôi đã tìm thấy hai cách để làm điều này:Đặt kiểu GridViewColumnHeader từ bên trong kiểu ListView

1) Bằng cách đặt một chìa khóa phong cách và tham khảo phong cách trong GridView:

<Style TargetType="{x:Type GridViewColumnHeader}" x:Key="MyHeaderStyle"> 
    <Setter Property="Background" Value="Wheat" /> 
</Style> 

<GridView ColumnHeaderContainerStyle="{StaticResource MyHeaderStyle}"> 

2) Bằng cách không thiết lập một phím phong cách cho phong cách trên. Bây giờ tôi không cần phải tham khảo phong cách trong GridView, NHƯNG nó cũng ghi đè tất cả các tiêu đề listview trong ứng dụng của tôi độc lập với loại listview.

Vì tôi sử dụng nhiều lần xem danh sách trong ứng dụng của mình, tôi muốn thực hiện điều này theo cách thứ ba và linh hoạt hơn; bằng cách đặt GridView.ColumnHeaderContainerStyle từ bên trong một kiểu ListView. Bằng cách đó tôi sẽ không cần phải tham khảo kiểu tiêu đề trong mỗi GridView. Đây là một phiên bản đơn giản của XAML cho đến nay:

<Window.Resources> 
    <Style TargetType="{x:Type GridViewColumnHeader}" x:Key="MyHeaderStyle"> 
     <Setter Property="Background" Value="Wheat" /> 
    </Style> 

    <Style TargetType="{x:Type list:MyListView}"> 
     <Setter Property="GridView.ColumnHeaderContainerStyle" Value="{StaticResource MyHeaderStyle}" />    
     <Setter Property="Background" Value="Linen" />         
    </Style> 
</Window.Resources> 

<list:MyListView> 
    <list:MyListView.View> 
     <GridView> 
      <GridViewColumn Header="Column1" /> 
      <GridViewColumn Header="Column2" /> 
     </GridView> 
    </list:MyListView.View> 
</list:MyListView> 

này tiếc là không thiết lập các phong cách tiêu đề ... Nếu tôi thực hiện thay đổi này đến XAML trên, nó hoạt động:

<GridView ColumnHeaderContainerStyle="{StaticResource MyHeaderStyle}"> 

Bất kỳ ý tưởng?

Trả lời

6

Cảm ơn snurre để chỉ cho tôi đúng hướng. Tôi tìm thấy một cách để hoàn thành chính xác những gì tôi muốn.

Bạn không cần đặt phần Tài nguyên trong ListView (loại thẻ tùy chỉnh đó cho mỗi ListView là thứ tôi muốn loại bỏ ngay từ đầu). Tài nguyên có thể được chuyển sang kiểu ListView thay thế.

Đây là XAML cập nhật mà làm việc một cách chính xác cách tôi muốn nó:

<Window.Resources> 
    <Style TargetType="{x:Type GridViewColumnHeader}" x:Key="MyHeaderStyle"> 
     <Setter Property="Background" Value="Wheat" /> 
    </Style> 

    <Style TargetType="{x:Type list:MyListView}"> 
     <Style.Resources> 
      <Style TargetType="{x:Type GridViewColumnHeader}" BasedOn="{StaticResource MyHeaderStyle}" /> 
     </Style.Resources> 

     <Setter Property="Background" Value="Linen" />         
    </Style> 
</Window.Resources> 

<list:MyListView> 
    <list:MyListView.View> 
     <GridView> 
      <GridViewColumn Header="Column1" x:Name="col1" /> 
      <GridViewColumn Header="Column2" x:Name="col2" /> 
     </GridView> 
    </list:MyListView.View> 
</list:MyListView> 
3

Nếu không có khóa, nó sẽ áp dụng cho tất cả các thành phần được chỉ định TargetType. Nếu phong cách của bạn có một phím, bạn phải sử dụng nó một cách rõ ràng:

<GridViewColumn HeaderContainerStyle="{StaticResource MyHeaderStyle}" Header="Column1"/> 

Ngoài ra, bạn có thể thiết lập các phong cách trong ListView của bạn, vì vậy nó chỉ áp dụng đối với các yếu tố bên trong nó:

<list:MyListView> 
    <list:MyListView.Resources> 
     <Style TargetType="{x:Type GridViewColumnHeader}"> 
      <Setter Property="Background" Value="Wheat" /> 
     </Style> 
    </list:MyListView.Resources> 
</list:MyListView> 
Các vấn đề liên quan