문제

Silverlight에서 ControlTemplate에서 요소를 동적으로 스케일링하는 사용자 정의 컨트롤을 만들려고합니다. ControlTemplate의 첫 번째 시도는 다음과 같습니다.

<ControlTemplate TargetType="controls:ProgressBar">
   <Grid>
      <Rectangle x:Name="TrackPart" Fill="{TemplateBinding Background}" HorizontalAlignment="Left" />
      <Rectangle x:Name="ProgressPart" Fill="Blue" >
      <Rectangle.RenderTransform>
         <ScaleTransform ScaleX="{TemplateBinding Progress}" />
            </Rectangle.RenderTransform>
         </Rectangle> 
   </Grid>
</ControlTemplate>

하지만, 이 포럼 스레드 TemplateBinding은 FrameworkElements의 파생 상품에만 작동한다고 말합니다. ScaleTransform은 프레임 워크 레코 노트가 아닙니다. 이것을위한 작업이 있습니까? 이런 상황에 대한 모범 사례가 있습니까?

도움이 되었습니까?

해결책

RenderTransform의 scalex 및 scaley 속성을 바인딩하는 대신 rendertransform 자체를 바인딩 할 수 있습니다. 문제는 소스가 이중 값이며 변환이 필요하다는 것입니다. 따라서 두 배를 ScaleTransform으로 변환 할 수 있어야합니다. ivalueconverter를 만들 수 있습니다.

public class TransformConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value is double)
        {
            double d = (double)value;
            return new ScaleTransform { ScaleY = d, ScaleX = d };
        }
        else
        {
            return new ScaleTransform();
        }
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

TemplateBinding에서 사용할 IvalueConverter를 지정할 수 없으므로 템플릿 배치로 친척과 함께 정기적 인 바인딩을 사용할 수 있습니다. 이와 같이:

    <Rectangle x:Name="ProgressPart" Fill="Blue" 
           RenderTransform="{Binding Path=Progress, RelativeSource={RelativeSource TemplatedParent}, Converter={StaticResource converter1}}" >

그리고 바인딩의 범위에 IvalueConverter를 ControlTemplate의 루트의 자원에 배치해야합니다.

<ControlTemplate TargetType="controls:ProgressBar">
    <Grid>
        <Grid.Resources>
            <local:TransformConverter x:Key="converter1" />
        </Grid.Resources>

다른 팁

직사각형과 같은 간단한 항목을 항상 사용하고 있다고 가정하면 사각형의 높이와 너비를 진행에 바인딩 한 다음 바인딩 컨버터를 사용하여 그에 따라 값을 조정할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top