Я создал простой пользовательский элемент управления, который выводится из 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);
}
}