Короткий ответ: нет. ControlTemplate — это, по сути, черный ящик, по крайней мере, когда речь идет о XAML (есть способы копаться в визуальном дереве кода).
Когда вы говорите, что «не можете использовать TemplateBinding», почему бы и нет? Если у вас просто недостаточно доступных свойств, это можно исправить, создав некоторые прикрепленные свойства для значений, которые вы хотите передать. Это предполагает, что вы создаете шаблон элемента управления, который вы не можете изменить, в противном случае вы можете просто добавить новые свойства зависимостей.
Прикрепленное свойство:
public static class CustomProps
{
public static readonly DependencyProperty MyNewBrushProperty = DependencyProperty.RegisterAttached(
"MyNewBrush",
typeof(Brush),
typeof(CustomProps),
new UIPropertyMetadata(Brushes.Green));
public static Brush GetMyNewBrush(DependencyObject target)
{
return (Brush)target.GetValue(MyNewBrushProperty);
}
public static void SetMyNewBrush(DependencyObject target, Brush value)
{
target.SetValue(MyNewBrushProperty, value);
}
}
И использование в стиле и шаблоне:
<Style TargetType="{x:Type Button}">
<Setter Property="local:CustomProps.MyNewBrush" Value="Red" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Button}">
<Border Background="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=(local:CustomProps.MyNewBrush)}">
<ContentPresenter/>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
Использование этого метода также позволяет переопределять значения в отдельных экземплярах.
person
John Bowen
schedule
02.03.2010