2011-09-05 10 views
10

He editado una plantilla desde una casilla de verificación, luego agregué una imagen en ella sin definir su propiedad "Fuente".Pase el parámetro a una plantilla personalizada

Estilo:

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

Mi pregunta es cómo pasar esa propiedad "Fuente" (en XAML) para la plantilla "ImageCheckBox" en este código:

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

para que la imagen se mostrará el parámetro pasado.

Gracias

+0

¿Cómo va a pasar el parámetro? –

+1

Esta es mi pregunta :) Quiero pasar un parámetro Fuente como: Source = "image.ico" a ImageCheckBox; Entonces, ¿cómo exponer la propiedad Fuente de imagen en la plantilla CheckBox? – Arslan

Respuesta

7

No hay forma de pasar parámetros personalizados a un estilo o plantilla. Solo puede acceder a las propiedades en los datos de control o encuadernados. Dicho esto, puede abusar de la propiedad Etiqueta de la casilla de verificación para lograr esto, pero no estoy 100% funcionará.

La forma correcta de hacerlo es crear un nuevo control personalizado que se deriva de Checkbox y agregar una propiedad de dependencia que contenga su imagen (del tipo ImageSource). De esta manera, a partir de su plantilla de control Generic.xaml interior se puede hacer

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

y donde instancia su casilla haces

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

Hice su camino, gracias – Arslan

1

Es necesario definir Fuente de Imagen de ImageCheckbox plantilla o crear su propia CheckBox que deriva de CheckBox estándar, añadir una propiedad de dependencia del tipo ImageSource a CheckBox personalizado, definir plantilla personalizada con la unión a la Fuente la propiedad de nuevo control creado.

+0

Gracias, es lo mismo que el enfoque de Isak. – Arslan

+0

@Ars, ¡De nada! –

21

Puede utilizar la propiedad Tag

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

Y luego se une a la fuente del Image en el Template al Tag

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

Sin embargo, prefiero usar una propiedad adjunta por varias razones.

  • La intención de utilizar Tag no está realmente claro
  • Puede que esté utilizando la propiedad Tag para otra cosa
  • Es posible que desee utilizar más de un ImageSource etc.

El el uso de una propiedad adjunta es exactamente el mismo, excepto que debe poner paréntesis alrededor de la propiedad adjunta.

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

En Plantilla

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

Y aquí es la propiedad adjunta 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

Buen enfoque. No pensé en usar propiedades adjuntas para esto. +1 –

+1

Bonito enfoque como Isak dijo +1 – Arslan

+0

O si desea soporte de intellisense, herede el nuevo CheckBox con una propiedad adicional de dependencia de ImageSource. '{Binding ImageSource, RelativeSource = {RelativeSource AncestorType = {x: escriba local: MyCheckBoxWithImageSource}}}' –

Cuestiones relacionadas