1

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>

ただし、このフォーラムスレッドでは、TemplateBindingはFrameworkElementsの派生物でのみ機能すると述べています。ScaleTransformはFrameworkElementではありません。これに対する回避策はありますか?この種の状況に対するベストプラクティスはありますか?

4

2 に答える 2

6

RenderTransform の ScaleX プロパティと ScaleY プロパティをバインドするのではなく、RenderTransform 自体をバインドできます。問題は、ソースが double 値であり、Transform が必要なことです。したがって、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 を TemplatedParent として通常の Binding を使用できます。このような:

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

IValueConverter を ControlTemplate のルートのリソースに、Binding のスコープ内に配置する必要があります。

<ControlTemplate TargetType="controls:ProgressBar">
    <Grid>
        <Grid.Resources>
            <local:TransformConverter x:Key="converter1" />
        </Grid.Resources>
于 2009-09-09T22:22:37.170 に答える
1

長方形のような単純なアイテムを常に使用していると仮定すると、長方形の高さと幅を進行状況にバインドし、バインドコンバーターを使用してそれに応じて値を調整できます。

于 2009-09-09T20:20:53.733 に答える