2011-09-05 29 views
10

Tôi đã chỉnh sửa mẫu từ hộp kiểm, sau đó tôi đã thêm hình ảnh vào mẫu đó mà không xác định thuộc tính "Nguồn" của nó.Truyền thông số vào mẫu tùy chỉnh

Kiểu:

<Style x:Key="ImageCheckbox" TargetType="{x:Type CheckBox}"> 
     <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/> 
     <Setter Property="Background" Value="{StaticResource CheckBoxFillNormal}"/> 
     <Setter Property="BorderBrush" Value="{StaticResource CheckBoxStroke}"/> 
     <Setter Property="BorderThickness" Value="1"/> 
     <Setter Property="FocusVisualStyle" Value="{StaticResource EmptyCheckBoxFocusVisual}"/> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type CheckBox}"> 
        <Image x:Name="image" Width="20" Height="20" Stretch="UniformToFill"/>      
        <ControlTemplate.Triggers> 
         <Trigger Property="HasContent" Value="true"> 
          <Setter Property="FocusVisualStyle" Value="{StaticResource CheckRadioFocusVisual}"/> 
          <Setter Property="Padding" Value="4,0,0,0"/> 
         </Trigger> 
         <Trigger Property="IsEnabled" Value="false"> 
          <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/> 
         </Trigger> 
        </ControlTemplate.Triggers> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style>  

Câu hỏi của tôi là làm thế nào để vượt qua rằng "Nguồn" tài sản (trong XAML) để "ImageCheckBox" mẫu trong mã này:

<CheckBox Content="" Margin="0,2,0,0" Name="btTogglePalette" Grid.Row="1" Command="Helpers:UICommands.TogglePalette" 
           IsChecked="{Binding Path=PaletteStatus, Mode=TwoWay}" VerticalAlignment="Center" HorizontalAlignment="Center" 
           Style="{DynamicResource ImageCheckbox}"> 

Vì vậy mà hình ảnh sẽ hiển thị thông số được truyền.

Cảm ơn bạn

+0

Làm thế nào bạn sẽ vượt qua tham số? –

+1

Đây là câu hỏi của tôi :) Tôi muốn chuyển một tham số Nguồn như: Source = "image.ico" tới ImageCheckBox; Vậy làm cách nào để hiển thị thuộc tính Nguồn hình ảnh trong mẫu Hộp kiểm? – Arslan

Trả lời

7

Không có cách nào để chuyển thông số tùy chỉnh vào kiểu hoặc mẫu. Bạn chỉ có thể truy cập các thuộc tính trên điều khiển hoặc dữ liệu bị ràng buộc. Điều đó nói rằng, bạn có thể lạm dụng thuộc tính Thẻ của hộp kiểm để thực hiện điều này nhưng tôi không 100% nó sẽ hoạt động.

Cách thích hợp để thực hiện việc này là tạo một điều khiển tùy chỉnh mới xuất phát từ Checkbox và thêm thuộc tính phụ thuộc giữ hình ảnh của bạn (loại ImageSource). Bằng cách đó, từ mẫu kiểm soát của bạn bên trong generic.xaml bạn có thể làm

<!-- in generic.xaml, inside the ControlTemplate for your ImageCheckbox style --> 
<Image Source="{TemplateBinding ImageSource}" /> 

và nơi bạn nhanh chóng hộp kiểm của bạn, bạn làm

<local:ImageCheckbox ImageSource="Resources/MyImage.png" ...etc... /> 
+0

Tôi đã làm theo cách của bạn, Cảm ơn bạn – Arslan

1

Bạn cần phải xác định Source trong Ảnh của ImageCheckbox mẫu hoặc tạo CheckBox riêng của bạn bắt nguồn từ CheckBox tiêu chuẩn, thêm tài sản phụ thuộc của loại ImageSource để CheckBox tùy chỉnh, xác định mẫu tùy chỉnh với ràng buộc để nguồn tài sản của mới tạo điều khiển.

+0

Cảm ơn bạn, nó giống như cách tiếp cận của Isak. – Arslan

+0

@Ars, Bạn được chào đón! –

21

Bạn có thể sử dụng tài sản Tag

<CheckBox Tag="YourImageSource" 
      Style="{DynamicResource ImageCheckbox}"/> 

Và sau đó liên kết Nguồn của số Image trong số Template tới Tag

<Image x:Name="image" Width="20" Height="20" Stretch="UniformToFill" 
     Source="{Binding RelativeSource={RelativeSource TemplatedParent}, 
         Path=Tag}"/> 

Tuy nhiên, tôi muốn sử dụng Thuộc tính được đính kèm vì một số lý do.

  • Mục đích của việc sử dụng Tag là không thực sự rõ ràng
  • Bạn có thể sử dụng Tag tài sản cho cái gì khác
  • Bạn có thể muốn sử dụng nhiều hơn một ImageSource, vv

Các việc sử dụng một thuộc tính được đính kèm hoàn toàn giống nhau, ngoại trừ bạn phải đặt các dấu ngoặc đơn quanh thuộc tính đính kèm.

<CheckBox local:ImageSourceExtension.ImageSource="YourImageSource" 
      Style="{DynamicResource ImageCheckbox}"/> 

Trong Template

<Image x:Name="image" Width="20" Height="20" Stretch="UniformToFill" 
     Source="{Binding RelativeSource={RelativeSource TemplatedParent}, 
         Path=(local:ImageSourceExtension.ImageSource)}"/> 

Và đây là các đính kèm tài sản ImageSource

public class ImageSourceExtension 
{ 
    public static DependencyProperty ImageSourceProperty = 
     DependencyProperty.RegisterAttached("ImageSource", 
              typeof(ImageSource), 
              typeof(ImageSourceExtension), 
              new PropertyMetadata(null)); 
    public static ImageSource GetImageSource(DependencyObject target) 
    { 
     return (ImageSource)target.GetValue(ImageSourceProperty); 
    } 
    public static void SetImageSource(DependencyObject target, ImageSource value) 
    { 
     target.SetValue(ImageSourceProperty, value); 
    } 
} 
+2

Cách tiếp cận tốt đẹp. Không nghĩ đến việc sử dụng thuộc tính đính kèm cho việc này. +1 –

+1

Cách tiếp cận tốt đẹp như Isak đã nói +1 – Arslan

+0

Hoặc nếu bạn muốn hỗ trợ intellisense, hãy thừa kế CheckBox mới với thuộc tính phụ thuộc ImageSource bổ sung. '{Binding ImageSource, RelativeSource = {RelativeSource AncestorType = {x: Gõ địa phương: MyCheckBoxWithImageSource}}}' –

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