Параметр Pass для настраиваемого шаблона
Я редактировал шаблон из флажка, затем добавил в него изображение без определения его свойства "Источник".
Стиль:
<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}">
Таким образом, изображение покажет переданный параметр.
Спасибо
Ответы
Ответ 1
Невозможно передать пользовательские параметры в стиль или шаблон. Вы можете получать доступ только к свойствам управляющих или связанных данных. Тем не менее, вы можете злоупотреблять свойством тега checkbox для выполнения этого, но я не на 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... />
Ответ 2
Вы можете использовать свойство Tag
<CheckBox Tag="YourImageSource"
Style="{DynamicResource ImageCheckbox}"/>
И затем привяжите Source 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 и т.д.
Использование Attached Property точно так же, за исключением того, что вы должны поместить скобки вокруг прикрепленного свойства.
<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);
}
}
Ответ 3
Вам нужно определить источник в изображении шаблона ImageCheckbox
или создать собственный CheckBox, полученный из стандартного CheckBox, добавить свойство зависимости типа ImageSource к пользовательскому CheckBox, определить настраиваемый шаблон с привязкой к свойству Source нового созданного элемента управления.