سؤال

وأنا أحاول لإنشاء عنصر تحكم مخصص في 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 ليس FrameworkElement. هل هناك عمل حول هذا؟ أي أفضل الممارسات لهذا النوع من الوضع هناك؟

هل كانت مفيدة؟

المحلول

وبدلا من ربط خصائص ScaleX ScaleY ومن RenderTransform، يمكنك ربط 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();
    }
}

وأنت لا يمكن تحديد IValueConverter لاستخدامها في TemplateBinding، لذلك يمكنك استخدام الربط العادية مع 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>

نصائح أخرى

وعلى افتراض أن كنت دائما باستخدام المواد البسيطة مثل المستطيل، هل يمكن ربط ارتفاع المستطيل والعرض إلى التقدم، ومن ثم استخدام محول ملزمة لضبط القيمة وفقا ل

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top