在WPF中,什么是TemplatedParent?

Dav*_*ith 31 wpf

我正在尝试理解RelativeSource绑定,但我找不到TemplatedParent的定义. MSDN说:

"获取一个静态值,用于返回为TemplatedParent模式构造的RelativeSource."

它没有出现在"Windows Presentation Foundation Unleashed"的索引中.

简单来说,什么是TemplatedParent呢?

Gab*_*abe 36

TemplatedParent指的Control是应用模板的实例.您可以使用TemplatedParent绑定到在该对象(及其基类)上声明的属性.

  • 因此,如果我在ItemsControl的DataTemplate中的StackPanel内部有一个TextBox,TextBox的TemplatedParent将是ItemsControl而不是StackPanel? (4认同)
  • @David:请参阅http://msdn.microsoft.com/en-us/library/system.windows.controls.contentpresenter.aspx了解所有血腥细节. (3认同)
  • @David:“ItemsControl”中项目的“TemplatedParent”不是您想象的那样。我相信它是一个“ContentPresenter”实例(“ItemsSource”中的每一项都有一个单独的实例)。 (2认同)

las*_*iya 13

TemplatedParent

此模式允许将给定的ControlTemplate属性绑定到应用ControlTemplate的控件的属性.为了更好地理解这个问题,下面是一个例子

<Window.Resources>
    <ControlTemplate x:Key="template">
            <Canvas>
                <Canvas.RenderTransform>
                    <RotateTransform Angle="20"/>
                    </Canvas.RenderTransform>
                <Ellipse Height="100" Width="150" 
                     Fill="{Binding 
                RelativeSource={RelativeSource TemplatedParent},
                Path=Background}">

                  </Ellipse>
                <ContentPresenter Margin="35" 
                      Content="{Binding RelativeSource={RelativeSource  
                      TemplatedParent},Path=Content}"/>
            </Canvas>
        </ControlTemplate>
    </Window.Resources>
        <Canvas Name="Parent0">
        <Button   Margin="50" 
                  Template="{StaticResource template}" Height="0" 
                  Canvas.Left="0" Canvas.Top="0" Width="0">
            <TextBlock FontSize="22">Click me</TextBlock>
        </Button>
    </Canvas>
Run Code Online (Sandbox Code Playgroud)

如果我想将给定控件的属性应用于其控件模板,那么我可以使用TemplatedParent模式.这个标记扩展也有类似的一个,它是TemplateBinding,它是第一个的简写,但TemplateBinding在编译时以TemplatedParent的对比度进行评估,TemplatedParent在第一个运行时之后进行评估.正如您在下图中所述,背景和内容从按钮内部应用到控件模板.


Ste*_*ung 6

在 WPF 中,模板是用来构造类型树的。WPF 本质上是在创建该类型的新对象时制作模板的副本。

因此,模板内部,如果要引用新对象,则使用TemplatedParent快速访问。否则,您将不得不使用RelativeSource向上走树来找到父对象。