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)
然后绑定的源Image在Template以Tag
<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属性进行其他操作附加属性的使用完全相同,除非您必须在附加属性周围加上括号.
<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)
无法将自定义参数传递给样式或模板.您只能访问控件或绑定数据的属性.也就是说,您可以滥用复选框的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)
| 归档时间: |
|
| 查看次数: |
10867 次 |
| 最近记录: |