2017-01-20 1 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

확실하지 않지만이 작업을 수행하면 두 번째 문제가 발생합니다. 그리드의 인스턴스가 하나만있을 것입니다. 여러 개의 OkayButton이있는 경우 마지막으로 만든 것만 콘텐츠를 가져옵니다. Content가'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

관련 문제