一般问题。我有一个相当复杂的ControlTemplate。几个TextBox等 我不能使用TemplateBinding将所有属性带到表面,以便我可以设置所有样式。
Style有没有办法'delv'进入控件中的控件来设置值?
希望我的问题很清楚,没有例子。
由于
答案 0 :(得分:1)
简短的回答是否定的。 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>
使用此方法仍允许覆盖单个实例上的值。