FrameworkElement.OnApplyTemplate 方法

定义

每当应用程序代码或内部进程 (例如重新生成布局传递) 调用 ApplyTemplate 时调用。 简单来说,这意味着在 UI 元素在应用中显示之前调用 方法。 重写此方法以影响类的默认模板后逻辑。

protected:
 virtual void OnApplyTemplate() = OnApplyTemplate;
void OnApplyTemplate();
protected virtual void OnApplyTemplate();
function onApplyTemplate()
Protected Overridable Sub OnApplyTemplate ()

示例

此示例演示 OnApplyTemplate 由自定义控件定义的替代。 替代旨在考虑调用方可能通过模板和样式系统定义和应用其自己的控件模板。 作为其定义的一部分,控件对模板中所需的命名元素(如“UpButton”)进行属性化。 然后 OnApplyTemplate ,在加载模板时基于此命名协定检索对象引用,并调用 GetTemplateChild。 (正在设置的值(例如“UpButtonElement”)引用在类级别定义的私有字段,以便类的其他成员可以在运行时将该部分引用为对象。) 此示例还调用私有方法 UpdateStates , (定义未) 显示。 这是另一个常见方案 OnApplyTemplate:确保为控件的起始状态设置视觉状态,在本例中,通过调用一个私有方法(该方法考虑控件的所有已定义状态),并调用 GoToState 来设置适当的状态。

protected override void OnApplyTemplate()
{
    UpButtonElement = GetTemplateChild("UpButton") as RepeatButton;
    DownButtonElement = GetTemplateChild("DownButton") as RepeatButton;
    TextElement = GetTemplateChild("TextBlock") as TextBlock;

    UpdateStates(false);
}

注解

虽然 OnApplyTemplateFrameworkElement 类定义的方法, OnApplyTemplate 但重写 OnApplyTemplate 的行为和方案主要与 Control 子类相关。 这是因为通常在 XAML 文件中定义的 Template 属性和应用模板的内部Windows 运行时逻辑专用于控件。 ContentPresenterContentControl 也存在专用模板行为。

实施者说明

此方法的基本实现是作为Windows 运行时内部行为实现的,它提供了一些基本的布局逻辑。 应始终从实现中调用基实现。 未能引用基本实现可能会导致不良布局行为。

派生类可以将此方法用作以下方案的通知或入口点:

  • 使用自定义代码生成可视化树的其余部分。
  • 运行仅在应用模板中的 XAML 定义的可视化树后才能运行的代码。 例如,通过调用 GetTemplateChild 获取对来自模板的命名元素的引用的代码,以便其他模板后运行时代码可以引用这些部件的成员。
  • 介绍仅在模板中的可视化树完成后才存在的服务。
  • 将类定义的事件处理程序附加到模板的各个部分或复合控件的控件父级。 例如,你可能希望类逻辑处理来自复合控件的 TextBox 模板部分的路由 KeyDown 事件。 你可以执行此操作,以便根据部件的低级别输入事件更新 UI 状态,而将引发特定于控件且由控件父级引发的其他事件。
  • 设置模板中依赖于其他因素的元素的状态和属性。 例如,属性值可能只能通过了解父元素或特定派生类使用通用模板来发现。 但请注意,设计良好的控件应使用 VisualStateManager 处理其视觉状态。 有关此概念的详细信息,请参阅 XAML 控件模板

OnApplyTemplate 通常比 Loaded 事件更适合处理模板创建的可视化树的调整。 在应用模板之前,可能会发生 Loaded 事件,并且可视树在 加载时可能不完整。

适用于

另请参阅