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