2009-04-29 19 views
51

Trong HTML/CSS bạn có thể xác định một phong cách mà có thể được áp dụng cho nhiều loại yếu tố, ví dụ:Bạn có thể xác định nhiều TargetTypes cho một kiểu XAML không?

.highlight { 
    color:red; 
} 

có thể được áp dụng cho cả P ​​và DIV, ví dụ:

<p class="highlight">this will be highlighted</p> 
<div class="highlight">this will also be highlighted</div> 

nhưng trong XAML bạn dường như phải xác định TargetType cho kiểu, nếu không bạn sẽ gặp lỗi:

<Style x:Key="formRowLabel" TargetType="TextBlock"> 

là có cách để cho phép áp dụng kiểu XAML cho nhiều thành phần hoặc e để mở nó như trong CSS?

Trả lời

59

Các bộ định dạng trong kiểu WPF được kiểm tra trong thời gian biên dịch; Kiểu CSS được áp dụng động.

Bạn phải chỉ định một loại để WPF có thể giải quyết các thuộc tính trong các bộ định cư đến các thuộc tính phụ thuộc của loại đó.

Bạn có thể đặt loại mục tiêu thành các lớp cơ sở có chứa các thuộc tính bạn muốn và sau đó áp dụng kiểu đó cho các lớp dẫn xuất. Ví dụ, bạn có thể tạo ra một phong cách cho các đối tượng điều khiển và sau đó áp dụng nó vào nhiều loại điều khiển (Button, TextBox, CheckBox, vv)

<Style x:Key="Highlight" TargetType="{x:Type Control}"> 
    <Setter Property="Foreground" Value="Red"/> 
</Style> 

...

<Button Style="{StaticResource Highlight}" Content="Test"/> 
<TextBox Style="{StaticResource Highlight}" Text="Test"/> 
<CheckBox Style="{StaticResource Highlight}" Content="Test"/> 
+0

Có nhưng nếu bạn muốn áp dụng nó cho Nút và Hộp văn bản nhưng không áp dụng Hộp kiểm? –

+1

Bạn có thể áp dụng nó cho bất cứ điều gì bạn muốn. Kiểu này phải được áp dụng cho điều khiển. Nếu chỉ được áp dụng cho TẤT CẢ các điều khiển nếu bạn xóa 'x: Key = "Highlight"'. Nếu bạn không muốn nó được áp dụng cho CheckBox, hãy thoát khỏi thuộc tính 'Style ='. –

+3

Làm rõ: Xóa 'x: Key = "Highlight"' khỏi định nghĩa Kiểu để áp dụng Kiểu cho TẤT CẢ các trường hợp thuộc loại đó. Với khóa, hãy xóa 'Style = "{StaticResource Highlight}"' khỏi điều khiển để xóa Kiểu khỏi điều khiển đó. –

-2

tôi đã làm việc này

<Style x:Key="HeaderStyleThin" TargetType="{x:Type Border}"> 
    <Setter Property="Background" Value="Black" /> 

    <Style.Resources> 
     <Style TargetType="{x:Type TextBlock}"> 
       <Setter Property="Background=" Value="Red" /> 
     </Style> 
     </Style.Resources> 

</Style> 
3

Có một câu trả lời thay thế cho câu hỏi. Bạn CÓ THỂ để tham số TargetType ra khỏi kiểu hoàn toàn, cho phép nó áp dụng cho các điều khiển khác nhau, nhưng chỉ khi bạn đặt trước tên thuộc tính bằng "Điều khiển".

<Style x:Key="Highlight"> 
    <Setter Property="Control.Foreground" Value="Red"/> 
</Style> 

Rõ ràng, điều này chỉ hoạt động đối với các thuộc tính của lớp điều khiển cơ sở. Nếu bạn cố gắng thiết lập ItemsSource nói, nó sẽ thất bại vì không có Control.ItemsSource

+1

Bằng cách này, bạn đang ngầm cho biết một TargetType; và khi bạn nói nó chỉ hoạt động nếu phần tử được áp dụng là một điều khiển. Do đó, điều này không cung cấp gì ngoài việc rời TargetType được đặt thành Kiểm soát. –

29
<!-- Header text style --> 
<Style x:Key="headerTextStyle"> 
    <Setter Property="Label.VerticalAlignment" Value="Center"></Setter> 
    <Setter Property="Label.FontFamily" Value="Trebuchet MS"></Setter> 
    <Setter Property="Label.FontWeight" Value="Bold"></Setter> 
    <Setter Property="Label.FontSize" Value="18"></Setter> 
    <Setter Property="Label.Foreground" Value="#0066cc"></Setter> 
</Style> 

<!-- Label style --> 
<Style x:Key="labelStyle" TargetType="{x:Type Label}"> 
    <Setter Property="VerticalAlignment" Value="Top" /> 
    <Setter Property="HorizontalAlignment" Value="Left" /> 
    <Setter Property="FontWeight" Value="Bold" /> 
    <Setter Property="Margin" Value="0,0,0,5" /> 
</Style> 

Tôi nghĩ cả hai phương pháp khai báo kiểu này có thể trả lời câu hỏi của bạn. Trong trường hợp đầu tiên, không có TargetType nào được chỉ định, nhưng tên thuộc tính được đặt trước bằng 'Nhãn'. Trong phần thứ hai, kiểu được tạo cho các đối tượng Label.

Một phương pháp để làm điều đó là:

<UserControl.Resources> 
    <Style x:Key="commonStyle" TargetType="Control"> 
    <Setter Property="FontSize" Value="24"/> 
    </Style> 
    <Style BasedOn="{StaticResource commonStyle}" TargetType="ListBox"/> 
    <Style BasedOn="{StaticResource commonStyle}" TargetType="ComboBox"/> 
</UserControl.Resources> 
+0

headerTextStyle chỉ có thể được áp dụng cho Nhãn và các lớp bắt nguồn từ nó, do đó bạn không có gì từ việc rời khỏi TargetType. –

+0

@Steve: Tôi nghĩ rằng điều này có thể trả lời nghi ngờ của bạn. – Gaurang

+0

cho ví dụ đầu tiên, bạn có thể thay thế 'Nhãn' bằng' UIElement' để làm cho nó hoạt động chung trên nhiều loại điều khiển – Julien

2

tôi muốn áp dụng một phong cách cho một TextBlock và một TextBox nhưng câu trả lời được lựa chọn không làm việc cho tôi vì TextBlock không kế thừa từ kiểm soát, trong trường hợp của tôi, tôi muốn làm ảnh hưởng đến tài sản Tầm nhìn, vì vậy tôi sử dụng FrameworkElement

<Style x:Key="ShowIfRequiredStyle" TargetType="{x:Type FrameworkElement}"> 
     <Setter Property="Visibility" Value="Collapsed"/> 
     <Style.Triggers> 
      <DataTrigger Binding="{Binding ShowIfRequiredStyle, UpdateSourceTrigger=PropertyChanged}" Value="true"> 
       <Setter Property="Visibility" Value="Visible"/> 
      </DataTrigger> 
     </Style.Triggers> 
</Style> 

<TextBlock Style="{StaticResource ResourceKey=ShowIfRequiredStyle}"/> 
<TextBox Style="{StaticResource ResourceKey=ShowIfRequiredStyle}"/> 

này làm việc cho các thuộc tính Visibility vì cả hai mục kế thừa từ FrameworkElement và tài sản được xác định ở đó. Tất nhiên điều này sẽ không làm việc cho các thuộc tính được định nghĩa chỉ trong Control, bạn có thể tìm kiếm cây phân cấp và cố gắng tìm lớp cơ sở, dù sao tôi nghĩ điều này có thể giúp ai đó vì đây là kết quả tìm kiếm hàng đầu và câu trả lời được chọn là không đầy đủ.

+1

yes TargetType = "{x: Type FrameworkElement}" đã làm việc cho tôi chứ không phải 'điều khiển' –

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