2017-11-01 7 views
1

でスタイルのターゲット上のプロパティに私はマウスがButton上にあるとき、それはGeometryだ変更ButtonGeometryDrawingを持つようにしたい:WPFバインドトリガー

<Style TargetType="{x:Type Button}"> 
    <Setter Property="Content"> 
     <Setter.Value> 
      <Rectangle> 
       <Rectangle.Fill> 
        <DrawingBrush> 
         <DrawingBrush.Drawing> 
          <DrawingGroup> 
           <DrawingGroup.Children> 
            <!-- This Binding works --> 
            <GeometryDrawing Brush="{Binding Foreground, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Button}}}" 
                Geometry="M8,8 1,8 1,3 8,3z M9,9 0,9 0,0 9,0z" /> 
           </DrawingGroup.Children> 
          </DrawingGroup> 
         </DrawingBrush.Drawing> 
        </DrawingBrush> 
       </Rectangle.Fill> 
      </Rectangle> 
     </Setter.Value> 
    </Setter> 
    <Style.Triggers> 
     <Trigger Property="IsMouseOver" Value="True"> 
      <Setter Property="Content"> 
       <Setter.Value> 
        <Rectangle> 
         <Rectangle.Fill> 
          <DrawingBrush> 
           <DrawingBrush.Drawing> 
            <DrawingGroup> 
             <DrawingGroup.Children> 
              <!-- This Binding does not work --> 
              <GeometryDrawing Brush="{Binding Foreground, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Button}}}" 
                  Geometry="M6,9 1,9 1,5 6,5z M7,10 0,10 0,3 7,3z M10,7 7,7 7,6 9,6 9,2 4,2 4,3 3,3 3,0 10,0z" /> 
             </DrawingGroup.Children> 
            </DrawingGroup> 
           </DrawingBrush.Drawing> 
          </DrawingBrush> 
         </Rectangle.Fill> 
        </Rectangle> 
       </Setter.Value> 
      </Setter> 
     </Trigger> 
    </Style.Triggers> 
</Style> 

しかし、それは私にこのエラーが発生します

System.Windows.Data Error: 4 : Cannot find source for binding with reference 'RelativeSource FindAncestor, AncestorType='System.Windows.Controls.Button', AncestorLevel='1''.

バインディングがにStyleSetterを動作しますが、しませんので、私は、なぜ知りませんのTriggerSetter

私はそれがなぜ後者でうまくいかないのか、それを解決するのか分かりません。

ご協力いただきありがとうございます。

EDIT: 私も両方が動作しませんでした、{TemplateBinding Button.Foreground}{RelativeSource = {RelativeSource TemplatedParent}}を試してみましたので、質問は今ある:は、どのように私はTriggerStyleのターゲット上のプロパティにバインドすることができますか? ContentSettersStyleからとTriggersを変更

答えて

3

それはスタイルのキャッシング要素とWPFで許可されていないあなたの場合、中に複数のボタンのためのコンテンツと同じ要素を使用しての問題のすべての種類を可能にする、悪い習慣です。

TriggersBindingは、作成時のボタンと同じビジュアルツリーにないため、機能しません。これは、データエラーがあなたに伝えるものです。

本当にしたいのは、ボタンのControlTemplateを変更することです。違いは、このスタイルを持つボタンごとにControlTemplateの新しい要素が作成されることです。

コントロールテンプレートサンプル:

<ControlTemplate x:Key="ButtonBaseControlTemplate1" TargetType="{x:Type ButtonBase}"> 
<Border x:Name="border" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" SnapsToDevicePixels="True"> 
    <Grid> 
     <Rectangle x:Name="normalIcon">       
      //same as before 
     </Rectangle> 
     <Rectangle x:Name="mouseOverIcon" Visibility="Collapsed"> 
      //same as before 
     </Rectangle> 
     <ContentPresenter x:Name="contentPresenter" ContentTemplate="{TemplateBinding ContentTemplate}" Content="{TemplateBinding Content}" ContentStringFormat="{TemplateBinding ContentStringFormat}" Focusable="False" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/> 
    </Grid> 
</Border> 
<ControlTemplate.Triggers> 
    //other triggers from default template 
    <Trigger Property="IsMouseOver" Value="True"> 
     <Setter Property="Background" TargetName="border" Value="#FFBEE6FD"/> 
     <Setter Property="BorderBrush" TargetName="border" Value="#FF3C7FB1"/> 
     <Setter Property="Visibility" TargetName="normalIcon" Value="Collapsed"/> 
     <Setter Property="Visibility" TargetName="mouseOverIcon" Value="Visible"/> 
    </Trigger> 
    //other triggers from default template 
</ControlTemplate.Triggers> 

+0

が、これはトリックを作った、ありがとうございました。また、理由を説明してくれてありがとうございます(つまり、悪い習慣であり、複数の要素とキャッシングに関する問題です)。 –