代码之家  ›  专栏  ›  技术社区  ›  James Hay

绑定到ControlTemplate中的转换

  •  1
  • James Hay  · 技术社区  · 16 年前

    我正在尝试在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。这方面有工作要做吗?对于这种情况有什么最佳实践吗?

    2 回复  |  直到 16 年前
        1
  •  6
  •   KeithMahoney    16 年前

    您可以绑定renderTransform本身,而不是绑定renderTransform的scalex和scaley属性。 问题是源是一个双值,您需要一个转换。所以您需要能够将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使用常规绑定。这样地:

        <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>
    
        2
  •  1
  •   Jacob Adams    16 年前

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