Jat*_*tin 4 wpf dependency-properties attached-properties
我正在尝试使用按钮控制中的图像,通过显示不同的图像来动画显示悬停和按下状态.因此,我已经为按钮控件定义了3个附加属性,如下所示.
public class ButtonExtensions : DependencyObject {
public static DependencyProperty ImageSourceProperty = ...
public static DependencyProperty ImageHoverSourceProperty = ...
public static DependencyProperty ImagePressedSourceProperty =
DependencyProperty.RegisterAttached("ImagePressedSource", typeof(string), typeof(ButtonExtensions));
public static string GetImagePressedSource(Button target) { return (string)target.GetValue(ImagePressedSourceProperty); }
public static void SetImagePressedSource(Button target, string value) { target.SetValue(ImagePressedSourceProperty, value); }
Run Code Online (Sandbox Code Playgroud)
我在Button的Style属性设置器中设置了这些属性,如下所示
<Style x:Key="AddButtonStyle" TargetType="{x:Type Button}" >
<Setter Property="gs:ButtonExtensions.ImageSource" Value="/HotelReservation.ControlLibrary;component/Images/add-record-icon.png"/>
<Setter Property="gs:ButtonExtensions.ImageHoverSource" Value="/HotelReservation.ControlLibrary;component/Images/add-record-hover-icon.png"/>
<Setter Property="gs:ButtonExtensions.ImagePressedSource" Value="/HotelReservation.ControlLibrary;component/Images/add-record-pressed-icon.png"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Button}">
<Grid Height="32" Width="32">
<!-- How to use TemplateBinding Here. This does not work -->
<Image Name="Normal" Source="{TemplateBinding Property=gs:ButtonExtensions.ImageSource}" />
/>
<!-- This Works -->
<Image Name="Hover" Source="/HotelReservation.ControlLibrary;component/Images/add-record-hover-icon.png" Opacity="0"/>
<Image Name="Pressed" Source="/HotelReservation.ControlLibrary;component/Images/add-record-pressed-icon.png" Opacity="0" />
</Grid>
...
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
Run Code Online (Sandbox Code Playgroud)
如您所见,我正在尝试从Button的控件模板中访问自定义附加属性.我可以得到它的辛勤工作的编码源的属性图像控制,但我wan't使用TemplateBinding代替
使用附加属性作为绑定源需要在属性路径中使用括号.您将不得不使用常规绑定而不是TemplateBinding:
<Image Source="{Binding Path=(gs:ButtonExtensions.ImagePressedSource),
RelativeSource={RelativeSource TemplatedParent}}"/>
Run Code Online (Sandbox Code Playgroud)
另请注意,只有在声明附加属性时,才需要从DependencyObject派生ButtonExtensions类.
还建议将DependencyProperty字段声明为只读:
public static readonly DependencyProperty ImagePressedSourceProperty = ...
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1464 次 |
| 最近记录: |