1

カスタムコントロールがあります。カスタムコントロールには、いくつかの要素があります。これらの要素の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では、CanvasのHeight-Propertyに使用される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"/>

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

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は幅と高さがハードコーディングされているため、一般的にはお勧めできません。

于 2011-07-13T14:24:24.573 に答える