2010-09-03 30 views
6

Do ControlTemplates trong WPF có yêu cầu TargetType không? Tôi restyling một số điều khiển, và nhận thấy rằng các comboboxitem, listiviewitem và ListBoxItem tất cả đều có cùng một mẫu:WPF ControlTemplates phải có TargetType hay không?

<ControlTemplate x:Key="ListBoxItemCT" TargetType="{x:Type ListBoxItem}"> 

    <Border x:Name="Bd" 
     SnapsToDevicePixels="true" 
     Background="{TemplateBinding Background}" 
     BorderBrush="{TemplateBinding BorderBrush}" 
     BorderThickness="{TemplateBinding BorderThickness}" 
     Padding="{TemplateBinding Padding}" 
     CornerRadius="1"> 
     <ContentPresenter x:Name="cpItemContent" 
      HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" 
      VerticalAlignment="{TemplateBinding VerticalContentAlignment}" 
      SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" 
      /> 
    </Border> 

</ControlTemplate> 

Có thể chỉ cần loại bỏ các TargetType và có một mẫu cho tất cả ba? Tôi đang cố gắng để làm điều này nhưng có được lỗi lạ và các vấn đề. Tôi không thể tìm thấy bất kỳ tham chiếu cụ thể nào mà ControlTemplates phải có một loại.

Trả lời

12

Không có yêu cầu đối với TargetType, nhưng nếu bạn không chỉ định nó, nó sẽ hoạt động giống như khi bạn chỉ định TargetType of Control. Ưu điểm chính mà chỉ định một loại cho bạn quyền truy cập vào tất cả thuộc tính phụ thuộc của loại đó trong những thứ như TemplateBindings và Triggers mà không cần phải đủ điều kiện thuộc tính với loại chủ sở hữu. Nếu không có TargetType, bạn cũng có thể mất các ràng buộc ngầm, như ContentPresenter đến thuộc tính ContentControl.Content. Khi bạn chỉ định TargetType, mẫu đó chỉ có thể được áp dụng cho các điều khiển của loại đó hoặc được lấy từ loại đó. Để chia sẻ giữa các loại khác nhau chỉ cần chỉ định một lớp cơ sở chung - ContentControl trong trường hợp này.

Sau đây các mẫu đơn giản sẽ cho kết quả cơ bản giống nhau nhưng là người đầu tiên là thích hợp hơn và phổ biến hơn:

<ControlTemplate x:Key="CommonContentTemplate" TargetType="{x:Type ContentControl}"> 
    <Border x:Name="Bd" 
      SnapsToDevicePixels="true" 
      Background="{TemplateBinding Background}" 
      BorderBrush="{TemplateBinding BorderBrush}" 
      BorderThickness="{TemplateBinding BorderThickness}" 
      Padding="{TemplateBinding Padding}" 
      CornerRadius="1"> 
     <ContentPresenter x:Name="cpItemContent" 
          HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" 
          VerticalAlignment="{TemplateBinding VerticalContentAlignment}" 
          SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/> 
    </Border> 
</ControlTemplate> 

Nếu không có loại tất cả các thuộc tính Content cần phải được nối bằng tay:

<ControlTemplate x:Key="CommonTemplate"> 
    <Border x:Name="Bd" 
      SnapsToDevicePixels="true" 
      Background="{TemplateBinding Background}" 
      BorderBrush="{TemplateBinding BorderBrush}" 
      BorderThickness="{TemplateBinding BorderThickness}" 
      Padding="{TemplateBinding Padding}" 
      CornerRadius="1"> 
     <ContentPresenter x:Name="cpItemContent" 
          HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" 
          VerticalAlignment="{TemplateBinding VerticalContentAlignment}" 
          SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" 
          Content="{TemplateBinding ContentControl.Content}" 
          ContentTemplate="{TemplateBinding ContentControl.ContentTemplate}" 
          ContentTemplateSelector="{TemplateBinding ContentControl.ContentTemplateSelector}" 
          ContentStringFormat="{TemplateBinding ContentControl.ContentStringFormat}"/> 
    </Border> 
</ControlTemplate> 
+0

Cảm ơn! Tôi đã dành hai tuần cuối cùng để tạo ra biểu đồ đặc tính phụ thuộc lớn này, do đó điều đó có ý nghĩa. Tôi đoán tôi có thể thử rằng ... :) – dex3703

+0

Và điều đó sẽ giải thích các lỗi lạ tôi nhận được (về việc không tìm thấy những thứ có nguồn gốc từ Control) và tại sao nội dung sẽ không hiển thị. – dex3703

2

Tất cả đều lấy được từ System.Windows.Controls.ContentControl, vì vậy bạn có thể nhắm mục tiêu thay thế.

+0

Xin cảm ơn! cùng câu trả lời như trên nhưng ngắn gọn hơn. :) – dex3703

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