1

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

我说的这个高度是下面代码中的 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 中运行。

4

2 回答 2

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>
于 2011-07-14T10:14:54.873 回答
0

您的TemplateBindingSlider 模板中的 试图解析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也有硬编码的宽度和高度,这通常是一个坏主意。

于 2011-07-13T14:24:24.573 回答