FrameworkElement.Loaded 事件

定义

在已构造 FrameworkElement 并将其添加到对象树中并准备好交互时发生。

// Register
event_token Loaded(RoutedEventHandler const& handler) const;

// Revoke with event_token
void Loaded(event_token const* cookie) const;

// Revoke with event_revoker
FrameworkElement::Loaded_revoker Loaded(auto_revoke_t, RoutedEventHandler const& handler) const;
public event RoutedEventHandler Loaded;
function onLoaded(eventArgs) { /* Your code */ }
frameworkElement.addEventListener("loaded", onLoaded);
frameworkElement.removeEventListener("loaded", onLoaded);
- or -
frameworkElement.onloaded = onLoaded;
Public Custom Event Loaded As RoutedEventHandler 
<frameworkElement Loaded="eventhandler"/>
 

事件类型

示例

“加载”和 “卸载 ”的处理程序会自动附加到使用项目模板中 NavigationHelper 类的任何页面以获取支持。 事件连接在构造函数中完成。 处理程序使用 lambda 编写,并附加其他事件处理程序,以便页面导航可以使用鼠标或键盘事件。

this.Page.Loaded += (sender, e) =>
{
// Keyboard and mouse navigation only apply when occupying the entire window
if (this.Page.ActualHeight == Window.Current.Bounds.Height &&
    this.Page.ActualWidth == Window.Current.Bounds.Width)
    {
        // Listen to the window directly so focus isn't required
        Window.Current.CoreWindow.Dispatcher.AcceleratorKeyActivated +=
            CoreDispatcher_AcceleratorKeyActivated;
            Window.Current.CoreWindow.PointerPressed +=
            this.CoreWindow_PointerPressed;
    }
};

Loaded 事件是开始不绑定到主题动画或其他触发器的装饰动画的好时机。 此示例演示如何通过将 Loaded 处理程序连接到在动画 Storyboard 上调用 Begin 的方法,在 XAML 中触发 PointAnimation

<Canvas Width="450" Height="350">
    <Canvas.Resources>
        <Storyboard x:Name="myStoryboard">

            <!-- Animate the center point of the ellipse from 100 X, 300 Y
             to 400 X, 100 Y over 5 seconds. -->
            <PointAnimation
             Storyboard.TargetProperty="Center"
             Storyboard.TargetName="MyAnimatedEllipseGeometry"
             Duration="0:0:5" 
             From="100,300"
             To="400,100"
             RepeatBehavior="Forever" EnableDependentAnimation="True"/>

        </Storyboard>
    </Canvas.Resources>
    <Path Fill="Blue" Loaded="Start_Animation">
        <Path.Data>

            <!-- Describes an ellipse. -->
            <EllipseGeometry x:Name="MyAnimatedEllipseGeometry"
             Center="200,100" RadiusX="15" RadiusY="15" />
        </Path.Data>
    </Path>
</Canvas>
// Start the animation when the object loads
void SampleApp::Page::Start_Animation(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e)
{
    myStoryboard->Begin();
}
// Start the animation when the object loads
private void Start_Animation(object sender, RoutedEventArgs e)
{
    myStoryboard.Begin();
}
' Start the animation when the object loads
Private Sub Start_Animation(ByVal sender As Object, ByVal e As EventArgs)
    myStoryboard.Begin()
End Sub

注解

尽管此事件使用 RoutedEventHandler 委托和 RoutedEventArgs 作为事件数据,但该事件不是路由事件。 只能在引发事件 (的元素(即 发送方) )进行处理。 此事件的事件数据中的 OriginalSource 始终为 null

加载和对象生存期

在Windows 运行时实现中,可以保证在应用控件模板后发生 Loaded 事件,并且可以通过应用 XAML 模板来获取对创建的对象的引用。

Loaded 事件可用作一个点,用于挂接来自模板的元素上的事件处理程序,或调用依赖于所应用模板结果的子元素存在的逻辑。 在显示 UI 的 XAML 控件之前,加载是使用应用代码操作元素树结构的首选对象生存期事件。 如果初始布局上也不存在其他事件,则还适合从 Loaded 处理程序调用 VisualStateManager.GoToState 方法,以便设置在模板中定义的初始视图状态,前提是初始布局 (SizeChanged 确实发生在初始布局) 。

在Windows 运行时实现中加载的计时类似于Windows Presentation Foundation (WPF) 实现中的计时。 相比之下,Microsoft Silverlight 实现有一个计时问题,即在加载发生时无法依赖于正在加载的模板。 如果要从这些 XAML 框架迁移 XAML 或代码隐藏,可能需要调整加载处理程序中执行的操作,使其适合Windows 运行时实现的模板加载计时。

若要访问来自应用模板的项,可以使用 VisualTreeHelper 静态方法并按索引导航子元素。 或者,可以对模板化内容的根元素调用 FindName 方法,以查找具有给定 x:Name 属性值 的模板的特定部分。 请注意,必须在模板根而不是控件本身上调用 FindName ,因为每当由特定于该模板的模板创建对象时,都有一个 XAML 名称范围创建 (,有关详细信息,请参阅 XAML 名称范围) 。 若要访问模板根目录,请使用 VisualTreeHelper.GetChild(target,0) where target 是应用模板的对象。 获得该根后,可以随后访问命名部分。

如果从现有控件派生,则可以替代 OnApplyTemplate ,使行为成为默认类行为的一部分,而不是按实例处理 Loaded。 OnApplyTemplate 专门用作这种情况的回调,在这种情况下,你有一个来自应用模板的对象树,现在你想要检查或调整视觉对象。 这是定义自定义控件行为的关键部分,包括声明起始视觉状态和无法使用 On事件 替代模式定义的连接类处理程序等操作。 一个区别在于,从 OnApplyTemplate 范围中,应使用 GetTemplateChild 查找命名部件,而不是 FindName

LayoutUpdated 是一个相关事件。 LayoutUpdated 事件是启用控件序列中的最后一个“对象生存期”事件,在加载之后发生。 但是,将针对布局更改中涉及的对象(而不仅仅是树中的连续父级)触发 LayoutUpdated 。 UI 中的多个对象可能同时触发 LayoutUpdated 。 布局更改的原因多种多样,例如用户更改视图状态或屏幕分辨率,或者在同一 UI 或布局容器中以编程方式调整其他元素的大小。 因此,对于运行与初始布局或应用模板一起使用的代码,Loaded 通常是更好的选择。

对于在页面之间使用导航的应用代码,请勿使用 Page.OnNavigatedTo 对目标页上的控件进行元素操作或状态更改。 在加载模板之前调用 OnNavigatedTo 虚拟方法,因此模板中的元素尚不可用。 相反,请在新加载页面内容的根目录中附加 Loaded 事件处理程序,并在 Loaded 事件处理程序中执行任何元素操作、状态更改、事件连接等。

适用于

另请参阅