【发布时间】:2019-09-11 02:40:47
【问题描述】:
我注意到,如果用户控件(或任何框架元素)立即从可视化树中添加和删除,则永远不会引发 Loaded 事件,但始终会引发 Unloaded 事件。
要重现该问题,请创建一个空白 UWP 项目,将以下 XAML 和代码添加到 MainPage:
<Page ...>
<Grid>
<StackPanel>
<Button Click="Button_Click" Content="Click Me"/>
<Border x:Name="border"/>
</StackPanel>
</Grid>
</Page>
代码背后:
public MainPage() {
this.InitializeComponent();
this.control = new UserControl();
this.control.Loaded += OnLoaded;
this.control.Unloaded += OnUnloaded;
}
private void Button_Click(object sender, RoutedEventArgs e) {
this.border.Child = this.control;
this.border.Child = null;
}
private void OnLoaded(object sender, RoutedEventArgs e) {
System.Diagnostics.Debug.WriteLine("Loaded.");
}
private void OnUnloaded(object sender, RoutedEventArgs e) {
System.Diagnostics.Debug.WriteLine("Unloaded");
}
多次单击该按钮会给出以下输出:
Unloaded Unloaded Unloaded Unloaded Unloaded Unloaded Unloaded
FrameworkEvent.Loaded (MSDN):
在构建 FrameworkElement 并将其添加到 对象树,并准备好进行交互
FrameworkEvent.Unloaded (MSDN):
在此对象不再连接到主对象树时发生。
这里到底发生了什么?如果控件因为立即被移除而没有添加到可视化树中,为什么要调用 Unloaded 方法?有没有关于这种行为的文档?
【问题讨论】:
-
根据您的代码,
loaded事件不会被触发,因为它已经在您构造UserControl控件时重新构造 ->this.control = new UserControl();。 -
有一个 IsLoaded 属性,您可以检查它是否已经发生。
-
@Doedoe Loaded 不会在施工时被解雇。
-
@SeanO'Neil IsLoaded 属性仅支持最新版本的操作系统。此外,我的问题是关于(错误)行为,一种类似黑客的解决方法。
-
@MehrzadChehraz,你能分享一下 xaml 代码吗?