컨트롤 플레이트에서 변환에 결합합니다
-
05-07-2019 - |
문제
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>
다른 팁
직사각형과 같은 간단한 항목을 항상 사용하고 있다고 가정하면 사각형의 높이와 너비를 진행에 바인딩 한 다음 바인딩 컨버터를 사용하여 그에 따라 값을 조정할 수 있습니다.
제휴하지 않습니다 StackOverflow