我无法找到任何这方面的例子。使用自定义控件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");
}
我错过了什么? (善待:))感谢您的帮助。
答案 0 :(得分:2)
OnApplyTemplate
仅适用于自定义控件,而不适用于用户控件。 :)
您的C#代码是自定义控件的实现,但您的xaml代码是创建用户控件。
基本上,用户控件是用于将一些控件和面板组合在一起的,而自定义控件就像Button
,CheckBox
或ListView
。通常,您希望在扩展现有控件时创建自定义控件。在您的情况下,看起来您想要扩展UserControl
。
这个link也对它们进行了比较,也是如何创建它的一个很好的例子。