2016-04-06 8 views
0

コントロールテンプレート内でボタンアイコンとしてジオメトリドローイングを使用し、そのBrushプロパティをボタンのForegroundプロパティにバインドしたいが、機能しません。一方、ブラシを明示的に設定すると、ブラシが機能します。ポール・フィッシャーの答え -ButtonBindingのDrawingImage内でTemplateBindingが機能しない

<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

まあ、いくつかの奇妙な理由で、 'ブラシのために= "{バインディングフォアグラウンド、RelativeSource = {RelativeSource TemplatedParent}}"が動作します。これは他の回答で比較的よく記録されています。少なくとも誰かがそれについて詳述できますか?私はいくつかの有益な情報で答えを受け入れることをうれしく思っています... – heltonbiker

答えて

1

このWPF TemplateBinding vs RelativeSource TemplatedParentを参照してください:ここで

は私の(非稼働)のコードです。特に、TemplateBindingのについて、この部分:GeometryDrawingを::デッサン:アニメーション:Freezableの:のDependencyObject:DispatcherObjectに

•あなたがGeometryDrawingを見れば、あなたがその継承階層は、Freezableの含まれて見ることができますFreezables

のプロパティでは動作しません:Object

したがって、Freezable GeometryDrawingのBrushプロパティでTemplateBindingを使用することはできません。

BorderはFreezableから継承していないので、あなたがBorderのBorderBrushプロパティのTemplateBindingのを使用することができます:ボーダー:デコレータ:FrameworkElementの:のUIElement:ビジュアル:のDependencyObject:DispatcherObjectに:オブジェクト

関連する問題