Передать параметр в пользовательский шаблон - PullRequest
13 голосов
/ 05 сентября 2011

Я отредактировал шаблон из флажка, затем добавил в него изображение, не определяя его свойство «Источник».

Стиль:

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

Мой вопрос заключается в том, какпередайте это свойство «Source» (в 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}">

, чтобы изображение показывало переданный параметр.

Спасибо

Ответы [ 3 ]

23 голосов
/ 05 сентября 2011

Вы можете использовать свойство Tag

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

, а затем связать Источник Image в Template с Tag

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

Однако яЯ бы предпочел использовать Attached Property по ряду причин.

  • Цель использования 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);
    }
}
8 голосов
/ 05 сентября 2011

Невозможно передать пользовательские параметры стилю или шаблону.Вы можете получить доступ только к свойствам элемента управления или связанных данных.Тем не менее, вы можете злоупотреблять свойством 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... />
1 голос
/ 05 сентября 2011

Вам необходимо определить источник в образе шаблона ImageCheckbox или создать собственный CheckBox, производный от стандартного CheckBox, добавить свойство зависимости типа ImageSource в настраиваемый CheckBox, определить собственный шаблон с привязкой к свойству Source вновь созданного элемента управления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...