2016-04-06 50 views
0

我想在控件模板内使用GeometryDrawing作为按钮图标,并且我想将其Brush属性绑定到按钮的Foreground属性,但它不起作用。另一方面,如果我明确地设置了画笔,它就可以工作。TemplateBinding在按钮样式中的DrawingImage中不工作

这里是我的(非工作)代码:

<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> 
+0

那么,对于一些奇怪的原因,'刷= “{Binding Foreground,RelativeSource = {RelativeSource TemplatedParent}}”'工作。在其他答案中这是相当有据可查的。至少有人能详细说明这一点吗?我很乐意接受一些有用的信息...... – heltonbiker

回答

1

看到这个WPF TemplateBinding vs RelativeSource TemplatedParent保罗 - 费舍尔的回答。特别是,对于TemplateBinding这一部分:

•不能与性能上Freezables

工作,如果你看一下GeometryDrawing你可以看到它的继承层次包括可冻结:GeometryDrawing:图:设置动画:可冻结:DependencyObject的:DispatcherObject的:Object

因此,您无法在Freezable GeometryDrawing的Brush属性上使用TemplateBinding。

您可以使用在边框的BorderBrush属性TemplateBinding,因为Border不从可冻结继承:边框:装饰:FrameworkElement的:的UIElement:视觉:DependencyObject的:DispatcherObject的:对象