我有一个自定义控件。在自定义控件中,有几个元素。其中一个元素应该有一个特殊的高度值。
我正在谈论的这个高度是CanvasThickness,代码如下:
private double canvasThickness;
public static readonly DependencyProperty CanvasThicknessProperty =
DependencyProperty.Register("CanvasThickness",
typeof(double),
typeof(CustomControl1),
new FrameworkPropertyMetadata(3d));
public double CanvasThickness
{
get { return canvasThickness; }
set { canvasThickness = value; }
}
在generic.xaml中,这个CanvasThickness用于画布的高度属性:
<ControlTemplate x:Key="SliderTemplate" TargetType="{x:Type Slider}">
<Canvas Width="25" Height="{TemplateBinding local:CustomControl1.CanvasThickness}" Background="Green">
// Templating Slider
</Canvas>
</ControlTemplate>
<Style TargetType="{x:Type local:CustomControl1}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type local:CustomControl1}">
<Canvas Width="50" Height="20" Background="GreenYellow">
<Slider Template="{StaticResource SliderTemplate}" />
</Canvas>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
现在这个Slider的高度为3.假设我像这样使用CustomControl:
<ctrl:CustomControl1 CanvasThickness="12"/>
我认为Slider的高度为12.但它仍为3. CanvasThickness的值为12。
如何在PropertyChanged上重新绘制CustomControl?我尝试了FrameworkPropertyMetadataOptions,但它不会影响CustomControl。
提前致谢。
编辑:如果可能,解决方案也应该在Silverlight中运行。
答案 0 :(得分:1)
很简单:)
<Style x:Key="CanvasStyle" TargetType="{x:Type local:CustomCanvas}">
<Setter Property="Height" Value="{Binding Path=CanvasThickness, RelativeSource={RelativeSource AncestorType={x:Type local:CustomControl1}}}" />
</Style>
<ControlTemplate x:Key="SliderTemplate" TargetType="{x:Type Slider}">
<local:CustomCanvas Style="{StaticResource CanvasStyle}" Background="Green" />
</ControlTemplate>
<Style TargetType="{x:Type local:CustomControl1}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type local:CustomControl1}">
<Canvas Width="50" Height="20" Background="GreenYellow">
<Slider Template="{StaticResource SliderTemplate}" />
</Canvas>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
答案 1 :(得分:0)
Slider模板中的TemplateBinding
正在尝试解析模板化控件上名为CanvasThickness
的属性,该属性为Slider
,而不是您的自定义控件
我首先不明白Canvas
的观点。如果不确切地知道你想要达到的目标,就不可能说出来,但我怀疑你想要更接近这一点:
<Style TargetType="{x:Type local:CustomControl1}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type local:CustomControl1}">
<Border Width="50" Height="20" Background="GreenYellow">
<Slider Template="{StaticResource SliderTemplate}" Height="{TemplateBinding CanvasThickness}" />
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
即使这样,Border
也有硬编码的宽度和高度,这通常是一个坏主意。