2016-04-06 9 views
0

Я хочу использовать GeometryDrawing как значок кнопки внутри ControlTemplate, и я хочу, чтобы его свойство Brush было привязано к свойству кнопки Foreground, но оно не работает. С другой стороны, если я установлю Brush явно, это сработает.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

Ну, по какой-то странной причине, 'Brush = "{Binding Foreground, RelativeSource = {RelativeSource TemplatedParent}}" работает. Это относительно хорошо документировано в других ответах. Может, по крайней мере, кто-то это уточнит? Я был бы рад принять ответ с полезной информацией ... – heltonbiker

ответ

1

Смотрите этот WPF TemplateBinding vs RelativeSource TemplatedParent - ответ Пола Фишера. В частности, эта часть касается TemplateBinding:

• Не работает со свойствами на Freezables

Если вы посмотрите на GeometryDrawing вы можете увидеть его иерархия наследования включает в себя Freezable: GeometryDrawing: Чертеж: Animatable: Freezable: DependencyObject: DispatcherObject : Объект

Таким образом, вы не можете использовать свойство TemplateBinding для кисти объекта Freezable GeometryDrawing.

Вы можете использовать TemplateBinding на имущество BorderBrush границе, потому что Border не наследуется от Freezable: Граница: декоратор: FrameworkElement: UIElement: Визуальная: DependencyObject: DispatcherObject: Object