将参数传递给自定义模板

Ars*_*lan 14 c# wpf xaml templates

我从一个复选框中编辑了一个模板,然后我在其中添加了一个图像而没有定义它的"Source"属性.

风格:

<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>       
Run Code Online (Sandbox Code Playgroud)

我的问题是如何在这段代码中将"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}">
Run Code Online (Sandbox Code Playgroud)

这样图像就会显示传递的参数.

谢谢

Fre*_*lad 24

您可以使用该Tag物业

<CheckBox Tag="YourImageSource"
          Style="{DynamicResource ImageCheckbox}"/>
Run Code Online (Sandbox Code Playgroud)

然后绑定的源ImageTemplateTag

<Image x:Name="image" Width="20" Height="20" Stretch="UniformToFill"
       Source="{Binding RelativeSource={RelativeSource TemplatedParent},
                        Path=Tag}"/>
Run Code Online (Sandbox Code Playgroud)

但是,出于多种原因,我更倾向于使用附属物.

  • 使用的意图Tag并不十分明确
  • 您可能正在使用该Tag属性进行其他操作
  • 您可能想要使用多个ImageSource等.

附加属性的使用完全相同,除非您必须在附加属性周围加上括号.

<CheckBox local:ImageSourceExtension.ImageSource="YourImageSource"
          Style="{DynamicResource ImageCheckbox}"/>
Run Code Online (Sandbox Code Playgroud)

在模板中

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

这是附属物 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 好方法.没想到为此使用附加属性.+1 (2认同)

Isa*_*avo 8

无法将自定义参数传递给样式或模板.您只能访问控件或绑定数据的属性.也就是说,您可以滥用复选框的Tag属性来完成此操作,但我不是100%它会工作.

正确的方法是创建一个新的自定义控件,该控件派生Checkbox并添加一个包含图像(类型ImageSource)的依赖项属性.这样,你可以从generic.xaml里面的控件模板中做到

<!-- in generic.xaml, inside the ControlTemplate for your ImageCheckbox style -->
<Image Source="{TemplateBinding ImageSource}" />
Run Code Online (Sandbox Code Playgroud)

在那里你实例化你的复选框

<local:ImageCheckbox ImageSource="Resources/MyImage.png" ...etc... />
Run Code Online (Sandbox Code Playgroud)