2017-01-20 3 views
0

私は、ControlTemplateを含むButtonの基本スタイルを持っています。次に、 "OK"、 "Cancel"などの一般的に使用されるコンテンツを設定するスタイルに基づいていくつかのスタイルを作成します。など、私はいくつかのテキストが続くイメージを持っている、と私はテキストの高さに画像の高さをバインドしたいので、私は次のことを持っているこれらのスタイルでStyle setterのElementNameでバインドする

<Style x:Key="OkayButtonStyle" TargetType="{x:Type Button}" BasedOn="{StaticResource RoundedButtonStyle}"> 
    <Setter Property="Content"> 
     <Setter.Value> 
      <Grid HorizontalAlignment="Center"> 
       <Grid.ColumnDefinitions> 
        <ColumnDefinition Width="Auto"/> 
        <ColumnDefinition Width="Auto"/> 
       </Grid.ColumnDefinitions> 

       <Image Grid.Column="0" Source="{DynamicResource OkayIcon}" Height="{Binding ActualHeight, ElementName=ButtonText}"/> 
       <TextBlock x:Name="ButtonText" Grid.Column="1" Margin="5,0,0,0" Text="Okay"/> 
      </Grid> 
     </Setter.Value> 
    </Setter> 
</Style> 

そうするとエラーが表示されます:

System.Windows.Data Error: 4 : Cannot find source for binding with reference 'ElementName=ButtonText'. BindingExpression:Path=ActualHeight; DataItem=null; target element is 'Image' (Name=''); target property is 'Height' (type 'Double') 

私はそれが明らかにできないControlTemplateでButtonTextを見つけようとしていると思います。私がここでやろうとしていることを達成し、このスタイル設定者の中から別の要素のプロパティにバインドする方法はありますか?

+1

わかりませんが、この作業が完了すると2番目の問題に遭遇します。そのグリッドのインスタンスは1つしかありません。複数のOkayButtonがある場合は、最後に作成されたものだけがコンテンツを取得します。コンテンツは、 'x:Shared =" False "属性を持つ独自のキーを持つ別個のリソースでなければならないという問題を修正してください。 –

+0

私はそれがうまくいくと思います。 "{Binding RelativeSource = {RelativeSource FindAncestor、AncestorType = {x:Type Grid}}、Path = Children [1] .ActualHeight}"のようなバインディングを使用してみましたか? – nkoniishvt

答えて

1

なぜあなたのバインディングが機能しないのか分かりません。おそらく名前解決のビジュアルツリーが何か他のものであるからです。

これは私にとってはうまくいきますし、私がコメントで述べた共有リソースの問題にも対処しています。

<DataTemplate x:Key="ButtonContent" > 
    <Grid HorizontalAlignment="Center"> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="Auto"/> 
      <ColumnDefinition Width="Auto"/> 
     </Grid.ColumnDefinitions> 

     <Image 
      Grid.Column="0" 
      Source="{DynamicResource OkayIcon}" 
      Height="{Binding ActualHeight, ElementName=ButtonText}" 
      /> 

     <TextBlock 
      x:Name="ButtonText" 
      Grid.Column="1" 
      Margin="5,0,0,0" 
      Text="Okay" 
      FontSize="32" 
      /> 
    </Grid> 
</DataTemplate> 

<Style 
    x:Key="OkayButtonStyle" 
    TargetType="{x:Type Button}" 
    BasedOn="{StaticResource RoundedButtonStyle}" 
    > 
    <Setter Property="ContentTemplate" Value="{StaticResource ButtonContent}" /> 
</Style> 
+0

の場合に最も優れています。 – StuartMorgan

関連する問題