ControlTemplateの変換へのバインド
-
05-07-2019 - |
質問
ControlTemplateの要素を動的に拡大縮小するカスタムコントロールをSilverlightで作成しようとしています。 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>
ただし、 thisフォーラムスレッドは、TemplateBindingがFrameworkElementsの派生物でのみ機能すると述べています。 ScaleTransformはFrameworkElementではありません。これに対する回避策はありますか?この種の状況のベストプラクティスはありますか?
解決
RenderTransformのScaleXおよびScaleYプロパティをバインドする代わりに、RenderTransform自体をバインドできます。 問題は、ソースが二重の値であり、変換が必要なことです。したがって、doubleを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を指定することはできないため、RelativeSourceでの通常のBindingをTemplatedParentとして使用できます。このように:
<Rectangle x:Name="ProgressPart" Fill="Blue"
RenderTransform="{Binding Path=Progress, RelativeSource={RelativeSource TemplatedParent}, Converter={StaticResource converter1}}" >
そして、バインディングのスコープ内のControlTemplateのルートのリソースにIValueConverterを配置する必要があります。
<ControlTemplate TargetType="controls:ProgressBar">
<Grid>
<Grid.Resources>
<local:TransformConverter x:Key="converter1" />
</Grid.Resources>
他のヒント
常に長方形のような単純なアイテムを使用していると仮定すると、長方形の高さと幅を進行状況にバインドし、バインディングコンバーターを使用してそれに応じて値を調整できます
所属していません StackOverflow