TemplateBinding 在按钮样式的 DrawingImage 中不起作用
TemplateBinding not working inside a DrawingImage in a Button Style
我想在 ControlTemplate 中使用 GeometryDrawing 作为按钮图标,我希望它的 Brush
属性 绑定到按钮的 Foreground
属性 ,但它不起作用。另一方面,如果我明确设置 Brush,它会起作用。
这是我的(非工作)代码:
<Style x:Key="SimpleButtonStyle" TargetType="{x:Type Button}">
<Setter Property="Background" Value="LightGray"/>
<Setter Property="Foreground" Value="Black"/>
<Setter Property="BorderThickness" Value="2"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Button}">
<Border x:Name="border"
BorderBrush="{TemplateBinding Foreground}"
BorderThickness="{TemplateBinding BorderThickness}"
Background="{TemplateBinding Background}"
SnapsToDevicePixels="true">
<StackPanel Orientation="Vertical">
<Image x:Name="buttonImage" Height="20" Width="20">
<Image.Source>
<DrawingImage>
<DrawingImage.Drawing>
<!-- line below does not work -->
<GeometryDrawing Brush="{TemplateBinding Foreground}">
<GeometryDrawing.Geometry>
<EllipseGeometry RadiusX="15" RadiusY="15"/>
</GeometryDrawing.Geometry>
</GeometryDrawing>
</DrawingImage.Drawing>
</DrawingImage>
</Image.Source>
</Image>
<ContentPresenter x:Name="contentPresenter"/>
</StackPanel>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
查看此 WPF TemplateBinding vs RelativeSource TemplatedParent - Paul Fischer 的回答。特别是关于 TemplateBinding 的这一部分:
•不适用于 Freezables 上的属性
如果您查看 GeometryDrawing,您可以看到其继承层次结构包括 Freezable:GeometryDrawing:Drawing:Animatable:Freezable:DependencyObject:DispatcherObject:Object
因此,您不能在 Freezable GeometryDrawing 的画笔 属性 上使用 TemplateBinding。
您可以在 Border 的 BorderBrush 上使用 TemplateBinding 属性 因为 Border 不继承自 Freezable: Border:Decorator:FrameworkElement:UIElement:Visual:DependencyObject:DispatcherObject:Object
我想在 ControlTemplate 中使用 GeometryDrawing 作为按钮图标,我希望它的 Brush
属性 绑定到按钮的 Foreground
属性 ,但它不起作用。另一方面,如果我明确设置 Brush,它会起作用。
这是我的(非工作)代码:
<Style x:Key="SimpleButtonStyle" TargetType="{x:Type Button}">
<Setter Property="Background" Value="LightGray"/>
<Setter Property="Foreground" Value="Black"/>
<Setter Property="BorderThickness" Value="2"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Button}">
<Border x:Name="border"
BorderBrush="{TemplateBinding Foreground}"
BorderThickness="{TemplateBinding BorderThickness}"
Background="{TemplateBinding Background}"
SnapsToDevicePixels="true">
<StackPanel Orientation="Vertical">
<Image x:Name="buttonImage" Height="20" Width="20">
<Image.Source>
<DrawingImage>
<DrawingImage.Drawing>
<!-- line below does not work -->
<GeometryDrawing Brush="{TemplateBinding Foreground}">
<GeometryDrawing.Geometry>
<EllipseGeometry RadiusX="15" RadiusY="15"/>
</GeometryDrawing.Geometry>
</GeometryDrawing>
</DrawingImage.Drawing>
</DrawingImage>
</Image.Source>
</Image>
<ContentPresenter x:Name="contentPresenter"/>
</StackPanel>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
查看此 WPF TemplateBinding vs RelativeSource TemplatedParent - Paul Fischer 的回答。特别是关于 TemplateBinding 的这一部分:
•不适用于 Freezables 上的属性
如果您查看 GeometryDrawing,您可以看到其继承层次结构包括 Freezable:GeometryDrawing:Drawing:Animatable:Freezable:DependencyObject:DispatcherObject:Object
因此,您不能在 Freezable GeometryDrawing 的画笔 属性 上使用 TemplateBinding。
您可以在 Border 的 BorderBrush 上使用 TemplateBinding 属性 因为 Border 不继承自 Freezable: Border:Decorator:FrameworkElement:UIElement:Visual:DependencyObject:DispatcherObject:Object