FrameworkElement.Loaded 事件
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
在已构造 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"/>
事件类型
示例
和 Unloaded 的Loaded
处理程序会自动附加到使用项目模板中的 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
事件是启动不绑定到主题动画或其他触发器的装饰动画的好时机。 此示例演示如何在 XAML 中触发 PointAnimation,方法是将处理程序连接到Loaded
在动画情节提要上调用 Begin 的方法。
<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();
}
注解
尽管此事件使用 RoutedEventHandler 委托和 RoutedEventArgs 作为事件数据,但事件不是路由事件。 它只能在源自事件的元素上处理, (换言之, 发送方) 。 此事件的事件数据中的 OriginalSource 始终null
为 。
加载和对象生存期
在Windows 应用 SDK实现中Loaded
,保证在应用控件模板后发生事件,并且你可以获取对通过应用 XAML 模板创建的对象的引用。
事件 Loaded
可用作一个点,用于在来自模板的元素上挂接事件处理程序,或调用依赖于所应用模板结果的子元素是否存在的逻辑。 在显示 UI 的 XAML 控件之前,Loaded 是使用应用代码操作元素树结构的首选对象生存期事件。 如果初始 (布局) 上也不存在其他事件,也适合从 Loaded 处理程序调用 VisualStateManager.GoToState 方法,以便设置模板中定义的初始视图状态。
Windows 应用 SDK 实现中的 计时Loaded
与 wpf) 实现中的Windows Presentation Foundation (计时类似。 相比之下,Microsoft Silverlight 实现有一个计时问题,即在发生时 Loaded
无法依赖正在加载的模板。 如果要从这些 XAML 框架迁移 XAML 或代码隐藏,可能需要调整处理程序中Loaded
执行的操作,使其适合Windows 应用 SDK实现的模板加载计时。
若要访问来自已应用模板的项,可以使用 VisualTreeHelper 静态方法并按索引导航子元素。 或者,可以对模板化内容的根元素调用 FindName 方法,以查找具有给定 x:Name 属性值 的模板的特定部分。 请注意,必须在模板根而不是控件本身上调用 FindName ,因为每当由特定于该模板 (的模板创建对象时,都创建了一个 XAML 名称范围,有关详细信息,请参阅 XAML 名称范围) 。 若要访问模板根目录,请使用 VisualTreeHelper.GetChild(target,0)
,其中 target
是应用模板的对象。 获得该根后,即可访问命名部分。
如果从现有控件派生,则可以重写 OnApplyTemplate,使行为成为默认类行为的一部分,而不是按实例进行处理Loaded
。
OnApplyTemplate 专门用作这种情况的回调,其中你有一个来自已应用模板的对象树,现在想要检查或调整视觉对象。 这是定义自定义控件行为的关键部分,包括声明起始视觉状态和无法使用 On事件 替代模式定义的接线类处理程序等操作。 一个区别是,与 OnApplyTemplate 范围相比,应使用 GetTemplateChild 查找命名部件,而不是 FindName。
LayoutUpdated 是相关事件。
LayoutUpdated 事件是启用控件序列中的最后一个“对象生存期”事件,在 之后Loaded
发生。 但是, LayoutUpdated 是为布局更改中涉及的对象触发的,而不仅仅是树中的连续父级。 UI 中的多个对象可能同时触发 LayoutUpdated 。 布局更改发生的原因多种多样,例如用户更改视图状态或屏幕分辨率,或者以编程方式调整同一 UI 或布局容器中的其他元素的大小。 因此, Loaded
通常是运行与初始布局或已应用模板一起使用的代码的更好选择。
对于在页面之间使用导航的应用代码,不要使用 Page.OnNavigatedTo 对目标页上的控件进行元素操作或状态更改。 此虚拟方法在加载模板之前调用,因此模板中的元素尚不可用。 相反,在新加载的页面内容的根目录中附加 Loaded
事件处理程序,并在事件处理程序中 Loaded
执行任何元素操作、状态更改、事件连接等。