2011-01-05 4 views
0

저는 라이브러리간에 버튼 템플릿을 만들려고 시도했지만 실패했습니다. 템플리트는 기본적으로 경계가있는 원 안의 경계가있는 원입니다 (현재). 안쪽 테두리의 크기를 바깥 쪽보다 작게 만들기 위해 바인딩에 Converter를 사용합니다. 저는 TemplatedParent의 속성을 ConverterParameter로 전달하고 싶습니다.하지만 디자인 상 명백하게 작동하지 않습니다. ConveterParameter를 TemplatedParent 속성에 바인딩하려고하기 때문에 작동하지 않는 비트가 있습니다.바인딩 스타일 템플릿 - 작동 방식?

여기 (A ResourceDictionary의에서) 내 스타일 데프의 :

<SolidColorBrush x:Key="MyBorderFillColour">Yellow</SolidColorBrush> 
<SolidColorBrush x:Key="MyBorderEdgeColour">#ff652f00</SolidColorBrush> 
<SolidColorBrush x:Key="MyGeneralFillColour">#ffffffbd</SolidColorBrush> 
<s:Int32 x:Key="MyBorderThickness">10</s:Int32> 

<l:RelativeSizeConverter x:Key="RelativeSizeConverter" /> 

<Style x:Key="MyButtonStyle" TargetType="Button"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type Button}"> 
       <Grid> 
        <Ellipse 
         Fill="{StaticResource MyBorderFillColour}" 
         StrokeThickness="2" 
         Stroke="{StaticResource MyBorderEdgeColour}" 
         Height="{TemplateBinding Height}" 
         Width="{TemplateBinding Width}" /> 
        <Ellipse StrokeThickness="2" 
         Stroke="{StaticResource MyBorderEdgeColour}" 
         Fill="{StaticResource MyGeneralFillColour}" 
         Height="{Binding Path=Height, 
          RelativeSource={RelativeSource TemplatedParent}, 
          Converter={StaticResource RelativeSizeConverter}, 
          ConverterParameter={StaticResource MyBorderThickness}}" 
         Width="{Binding Path=Width, 
          RelativeSource={RelativeSource TemplatedParent}, 
          Converter={StaticResource RelativeSizeConverter}, 
          ConverterParameter={TemplateBinding BorderThickness}}" /> 
        <TextBlock 
         Text="{TemplateBinding Content}" 
         HorizontalAlignment="Center" 
         VerticalAlignment="Center" 
         Foreground="Black" 
         FontFamily="Calibri" 
         FontWeight="Bold" 
         FontSize="17" /> 
       </Grid> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

두 번째 타원의 높이가 정적 리소스를 사용하여 작동하지만, 폭은 TemplateBinding 방식을 사용하여 작동하지 않습니다. 나는 또한 시도했다

ConverterParameter={Binding Path=BorderThickness,RelativeSource={RelativeSource TemplatedParent}} 

나의 목표를 달성하는 방법 어떤 생각?!? 어떤 도움

덕분에,

답변

0

이이 값에 대한 바인딩 식을 제공하기 위해 때문에 작동하지 않습니다, 값은 종속성 속성이어야합니다. ConverterParameter는 종속성 속성이 아니므로 값을 바인딩 할 수 없습니다.

약간 더 구체적인 값 변환기를 만드는 약간 덜 일반적인 방법을 사용하는 방법은 어떻습니까? 그런 다음 '도트'경로를 사용하여 버튼이 변환기로 값으로 전달되면 너비, 경계 너비 등을 직접 액세스 할 수 있습니다.

Width="{Binding Path=., 
         RelativeSource={RelativeSource TemplatedParent}, 
         Converter={StaticResource RelativeWidthWidthBorderSizeConverter}}" 
+0

최고 - 나는 당신이 제안한 것처럼 버튼 자체에서 변환기를 사용하지만 원하는 속성을 ConverterParameter (예 : "BorderedWidth")로 사용하여 제안한 바대로 약간 일반적으로 변경했습니다. 그래서 너비 및 높이는 다음과 같다 : "{. 바인딩 경로 = RelativeSource = {RelativeSource TemplatedParent}, 변환기 = {정적 리소스 ButtonPropertyConverter}, ConverterParameter = BorderedHeight}". – AndyC

+0

높이 = 폭 = "{바인딩 경로 = RelativeSource = {RelativeSource TemplatedParent}, 변환기 = {정적 리소스 ButtonPropertyConverter}, ConverterParameter = BorderedWidth} "/> – AndyC

+0

쿨 - 당신이 아 지금이 유망한 소리 – ColinE

0

아무 것도 할 필요가 없습니다. 당신이 더 많은 유연성을 대신하는 TextBlock의 콘텐츠에 대한 ContentPresenter에 사용해야하는 것도

<Grid Height="{TemplateBinding Height}" Width="{TemplateBinding Width}"> 
     <Ellipse 
        Fill="{StaticResource MyBorderFillColour}" 
        StrokeThickness="2" 
        Stroke="{StaticResource MyBorderEdgeColour}"/> 
     <Ellipse StrokeThickness="2" Margin="4" 
        Stroke="{StaticResource MyBorderEdgeColour}" 
        Fill="{StaticResource MyGeneralFillColour}"/> 
     <TextBlock 
        Text="{TemplateBinding Content}" 
        HorizontalAlignment="Center" 
        VerticalAlignment="Center" 
        Foreground="Black" 
        FontFamily="Calibri" 
        FontWeight="Bold" 
        FontSize="17" /> 
    </Grid> 

참고 : 레이아웃 시스템 (여백 속성과 컨테이너에있는 타원의 스트레칭 동작을 사용하여) 당신을 위해 그것을 처리합니다 ; 템플릿 버튼의 사용자가보다 복잡한 내용을 제공하면 Button 계약이 실패합니다.

+0

:-) 응답에 만족한다면 답변으로 표시하십시오. 내가 알려 주마... – AndyC