TemplateBinding в generic.xaml и перерисовка свойства изменена - PullRequest
1 голос
/ 13 июля 2011

У меня есть пользовательский элемент управления.В пользовательских элементах управления есть несколько элементов.Один из этих элементов должен иметь специальное значение высоты.

Эта высота, о которой я говорю, - это 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>

Теперь этот слайдер имеет высоту 3. Допустим, я использую CustomControl следующим образом:

<ctrl:CustomControl1 CanvasThickness="12"/>

Я бы предположил, что слайдерВысота будет 12. Но все равно 3. Значение CanvasThickness равно 12.

Как переписать CustomControl на PropertyChanged?Я пробовал FrameworkPropertyMetadataOptions, но это не влияет на CustomControl.

Заранее спасибо.

РЕДАКТИРОВАТЬ: Если возможно, решение также должно работать в Silverlight.

Ответы [ 2 ]

1 голос
/ 14 июля 2011

Все просто:)

<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>
0 голосов
/ 13 июля 2011

TemplateBinding в шаблоне Slider пытается разрешить свойство с именем 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 имеет жестко заданную ширину и высоту, что, как правило, плохая идея.

...