OnApplyTemplate()如何用于UserControl?

时间:2014-12-16 19:24:12

标签: wpf xaml user-controls

我无法找到任何这方面的例子。使用自定义控件SimpleTextBlock(继承自TextBlock)定义下面的UserControl,我想在usercontrol代码隐藏中使用OnApplyTemplate()事件来获取仅在运行时呈现的SimpleTextBlock中已知的一些属性-time。

此代码不起作用。这是怎么做到的?

  XAML

    <UserControl x:Class="Nova5.UI.Views.Ink.InkEditorView"
              ..........
    <Grid Background="#FFE24848" >
              ..........

      <Canvas Grid.Row="1" Grid.RowSpan="3">

        <ScrollViewer VerticalScrollBarVisibility="Auto" 
            Width="{Binding Parent.ActualWidth, Mode=OneWay, RelativeSource={RelativeSource Self}}"
            Height="{Binding Parent.ActualHeight, Mode=OneWay, RelativeSource={RelativeSource Self}}">
            <Grid>
                <Grid.RowDefinitions>
                    <RowDefinition/>
                    <RowDefinition Height="100"/>
                </Grid.RowDefinitions>


                <fsc:SimpleTextBlock x:Name="PART_SimpleTextBlock"
                 Background="#FFE24848"
                 RichText="{Binding     RichText, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=UserControl}}"                 
                 FontSize="{Binding     FontSize, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=UserControl}}" 
                 FontStyle="{Binding   FontStyle, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=UserControl}}"
                 FontWeight="{Binding FontWeight, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=UserControl}}"   
                 FontFamily="{Binding FontFamily, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=UserControl}}"   
                  />
            </Grid>
        </ScrollViewer>
    </Canvas>
</Grid>

    C# code-behind:

      [TemplatePart(Name = "PART_SimpleTextBlock", Type = typeof(TextBlock))]
public partial class InkEditorView : UserControl
{

    public override void OnApplyTemplate()
    {
        base.OnApplyTemplate();

        *** t IS NULL ????
        SimpleTextBlock t = (SimpleTextBlock)base.GetTemplateChild("PART_SimpleTextBlock");


   }

我错过了什么? (善待:))感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

OnApplyTemplate仅适用于自定义控件,而不适用于用户控件。 :)

您的C#代码是自定义控件的实现,但您的xaml代码是创建用户控件。

基本上,用户控件是用于将一些控件和面板组合在一起的,而自定义控件就像ButtonCheckBoxListView。通常,您希望在扩展现有控件时创建自定义控件。在您的情况下,看起来您想要扩展UserControl

这个link也对它们进行了比较,也是如何创建它的一个很好的例子。