WPF控制模板:为什么在其明显的位置需要TargetType?

WPF控制模板:为什么在其明显的位置需要TargetType?,wpf,wpf-controls,Wpf,Wpf Controls,我对wpf中xaml过于冗长感到有点困惑。例如,在定义控件模板时,仍然必须将目标类型指定为控件本身。是否需要指定TargetType?因为我正在定义TargetControl的模板元素,所以在未指定时,它不是默认为TargetControl吗 <local:TargetControl Width="100" Height="100"> <local:TargetControl.Template> <ControlTemplate TargetType="l

我对wpf中xaml过于冗长感到有点困惑。例如,在定义控件模板时,仍然必须将目标类型指定为控件本身。是否需要指定TargetType?因为我正在定义TargetControl的模板元素,所以在未指定时,它不是默认为TargetControl吗

<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>

标记
表示使用默认构造函数创建新的ControlTemplate实例(
new ControlTemplate()
)。构造函数不知道哪个元素将使用模板

在这个例子中

<ControlTemplate TargetType="local:TargetControl">
  <Grid>
    <Ellipse x:Name="PART_Target" Fill="Blue" />
  <Grid>
</ControlTemplate>
此示例还演示了在资源字典中定义ControlTemplate而不连接特定元素的情况,因此无法推断TargetType

因此,至少有3种情况下,TargetType不确定或不需要。所以让开发人员始终提供具体的类型

<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>