2014-08-31 4 views
2

Я создал простой пользовательский элемент управления, который выводится из Control.привязка шаблона к ScaleTransform не работает в пользовательском контроле

Этот элемент управления имеет 2 DP, которые я связываю в xaml на ScaleTransform.

Код позади.

public class MyControl : Control 
{ 
     public static readonly DependencyProperty ScaleXProperty = DependencyProperty.Register(
     "ScaleX", typeof (double), typeof (MyControl), new FrameworkPropertyMetadata(OnScaleXChanged)); 

    public static readonly DependencyProperty ScaleYProperty = DependencyProperty.Register(
     "ScaleY", typeof (double), typeof (MyControl), new FrameworkPropertyMetadata(OnScaleYChanged)); 

       public double ScaleX 
    { 
     get { return (double) GetValue(ScaleXProperty); } 
     set { SetValue(ScaleXProperty, value); } 
    } 

    public double ScaleY 
    { 
     get { return (double) GetValue(ScaleYProperty); } 
     set { SetValue(ScaleYProperty, value); } 
    } 
} 

XAML.

<Style TargetType="{x:Type local:MyControl}"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type local:MyControl}"> 
       <Border Background="{TemplateBinding Background}" 
         BorderBrush="{TemplateBinding BorderBrush}" 
         BorderThickness="{TemplateBinding BorderThickness}"> 

        <Border.LayoutTransform> 
         <ScaleTransform ScaleX="{TemplateBinding ScaleX}" ScaleY="{TemplateBinding ScaleY}" /> 
        </Border.LayoutTransform> 


        <Image HorizontalAlignment="Stretch" 
          VerticalAlignment="Stretch" 
          Source="{TemplateBinding Icon}" 
          StretchDirection="Both" /> 
       </Border> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

Я использую MyControl в окне. После того, как я изменил свойства ScaleX и ScaleY в окне Window за LayoutTransform, нет огня.

Поэтому я добавил обработчиков в MyControl для ScaleX и ScaleY. Я этих обработчиков, которых я умею делать ScaleTransform. Это работает. Итак, где проблема в TemplateBinding?

С помощью этого обходного решения ScaleTransform работает.

private static void OnScaleXChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
     if (d is MyControl) 
     { 
      var ctrl = d as MyControl; 

      var x = (double) e.NewValue; 

      ctrl.LayoutTransform = new ScaleTransform(x, ctrl.ScaleY); 

     } 
    } 

ответ

2

Возможно, вы столкнулись с одним из многих ограничений TemplateBinding.

Таким образом, вместо того, чтобы использовать эквивалент Binding с относительного источника как шаблонного родителя, который семантически эквивалентен TemplateBinding, но (слегка) тяжелее:

<ScaleTransform ScaleX="{Binding ScaleX,RelativeSource={RelativeSource TemplatedParent}}" ScaleY="{Binding ScaleY,RelativeSource={RelativeSource TemplatedParent}}" />