2011-09-05 66 views
10

我從複選框編輯了模板,然後向其中添加了一個圖像,但未定義其「源」屬性。將參數傳遞給自定義模板

風格:

<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>  

我的問題是如何傳遞 「源」 屬性(在XAML)爲 「ImageCheckBox」 模板,在此代碼:

<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}"> 

,使圖像將顯示傳遞的參數。

謝謝

+0

你將如何傳遞參數? –

+1

這是我的問題:)我想通過Source參數,如:Source =「image.ico」ImageCheckBox;所以如何在CheckBox模板中公開Image Source屬性? – Arslan

回答

7

沒有辦法將自定義參數傳遞給樣式或模板。您只能訪問控件或綁定數據上的屬性。也就是說,你可能會濫用複選框的Tag屬性來實現這一點,但我不是100%,它會工作。

正確的做法是創建一個新的自定義控件,該控件源自Checkbox並添加一個用於保存圖像(類型爲ImageSource)的依賴項屬性。這樣一來,從你的控件模板generic.xaml你可以做

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

和你實例化你的複選框,這樣做

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

我按你的方式,謝謝 – Arslan

1

你需要ImageCheckbox模板的圖像來定義源或創建自己的複選框從標準的CheckBox派生,類型的ImageSource的依賴屬性添加到自定義的複選框,以綁定到源的新屬性來定義自定義模板創建控制。

+0

謝謝,這和Isak的方法一樣。 – Arslan

+0

@Ars,不客氣! –

21

可以使用Tag財產

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

而且然後將Template中的Image的來源綁定到Tag

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

但是,我更喜歡使用附加屬性的原因有很多。

  • 使用Tag的意圖是不是真的清楚
  • 你可能會使用Tag財產別的東西
  • 您可能需要使用一個以上的ImageSource等

的附加屬性的使用完全相同,除非您必須在附加屬性周圍放置括號。

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

模板

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

這裏是附加屬性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

不錯的做法。沒有想到使用附加屬性。 +1 –

+1

Isak說的好方法+1 – Arslan

+0

或者如果您想要智能感知支持,請使用額外的ImageSource依賴屬性繼承新的CheckBox。 '{Binding ImageSource,RelativeSource = {RelativeSource AncestorType = {x:Type local:MyCheckBoxWithImageSource}}}' –

相關問題