2017-12-29 6 views
2

私はwpfのxamlの過度の冗長さによって困惑しています。例えば、コントロールテンプレートを定義するときには、ターゲットタイプをコントロール自体として指定する必要があります。 TargetTypeの指定は必要ですか? TargetControlのテンプレート要素を定義しているので、指定されていないときはTargetControlにデフォルトではありませんか?WPFコントロールテンプレート:Why TargetTypeが必要なのはなぜですか?

<local:TargetControl Width="100" Height="100"> 
<local:TargetControl.Template> 
    <ControlTemplate TargetType="local:TargetControl"> 
     <Grid> 
     <Ellipse x:Name="PART_Target" Fill="Blue" /> 
     <Grid> 
    </ControlTemplate> 
</local:TargetControl.Template> 
</local:TargetControl> 

答えて

2

マークアップ<ControlTemplate> </ControlTemplate>は新しいControlTemplateのインスタンスは、デフォルトコンストラクタ(new ControlTemplate())を使用して作成することを意味しています。コンストラクタは、テンプレートを使用する要素を認識しません。この例では

<ControlTemplate TargetType="local:TargetControl"> 
    <Grid> 
    <Ellipse x:Name="PART_Target" Fill="Blue" /> 
    <Grid> 
</ControlTemplate> 

TemplateBinding秒間任意TargetControl固有のプロパティを使用しないため、テンプレートは、TargetTypeにすることなく使用することができます。 TemplateBindingsが必要な場合は、TargetTypeも設定する必要があります。

ほとんどの場合、要素テンプレートは要素の型と同じTargetTypeを持ちます。

例外的な場合があります。たとえば、自分のRadioButtonsとCheckBoxが色付き円のように見えるようにする - チェックされている場合は緑、チェックされていない場合は灰色です。

ラジオボタンとチェックボックスはトグルボタンから派生するので、私はトグルボタンのテンプレートを作成して、私のラジオボタンやチェックボックスに適用されます

<StackPanel> 
    <StackPanel.Resources> 
     <ControlTemplate TargetType="{x:Type ToggleButton}" x:Key="Toggle"> 
      <Border Name="btn" BorderBrush="Black" Background="Gainsboro" 
        Width="28" Height="28" CornerRadius="14" /> 

      <ControlTemplate.Triggers> 
       <Trigger Property="IsChecked" Value="True"> 
        <Setter Property="Background" TargetName="btn" Value="Lime" /> 
       </Trigger> 
      </ControlTemplate.Triggers> 
     </ControlTemplate> 
    </StackPanel.Resources> 

    <CheckBox Template="{StaticResource Toggle}" /> 
    <RadioButton Template="{StaticResource Toggle}" /> 
    <RadioButton Template="{StaticResource Toggle}" /> 
</StackPanel> 

この例では、ControlTemplateのは、特定の要素に接続せずにリソースディクショナリで定義されている状況を示しています、TargetTypeは推論できません。

TargetTypeが特定されていないか、必要でない場合が少なくとも3つあります。したがって、常に具体的なタイプを提供することは開発者に委ねられています

関連する問題