【问题标题】:Binding to Transforms in a ControlTemplate绑定到 ControlTemplate 中的转换
【发布时间】:2009-09-09 15:23:29
【问题描述】:

我正在尝试在 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>

但是,this forum thread 声明 TemplateBinding 仅适用于 FrameworkElements 的衍生产品。 ScaleTransform 不是 FrameworkElement。有解决办法吗?有针对这种情况的最佳做法吗?

【问题讨论】:

    标签: silverlight templatebinding


    【解决方案1】:

    您可以绑定 RenderTransform 本身,而不是绑定 RenderTransform 的 ScaleX 和 ScaleY 属性。 问题是源是双精度值,你需要一个变换。因此,您需要能够将双精度转换为 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>
    

    【讨论】:

    • 非常感谢。比我在类中创建转换并绑定到它们的解决方案要好得多。
    【解决方案2】:

    假设您总是使用矩形等简单项目,您可以将矩形的高度和宽度绑定到进度,然后使用绑定转换器相应地调整值

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-23
      • 1970-01-01
      • 1970-01-01
      • 2017-06-16
      • 1970-01-01
      • 2013-01-14
      • 1970-01-01
      相关资源
      最近更新 更多