generic.xaml中的T​​emplateBinding和属性上的重新绘制已更改

时间:2011-07-13 14:16:47

标签: wpf custom-controls templatebinding

我有一个自定义控件。在自定义控件中,有几个元素。其中一个元素应该有一个特殊的高度值。

我正在谈论的这个高度是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中运行。

2 个答案:

答案 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也有硬编码的宽度和高度,这通常是一个坏主意。