要在 WPF 中实现基于选项卡的环境,我们需要将表单转换为用户控件,但是这样做时,用户控件的 Loaded
事件会被调用两次。
在搜索互联网时,其他人也指出了这个问题。我们如何确保只调用一次加载事件?因为当它被多次调用时,我们控件的初始化会发生多次。
要在 WPF 中实现基于选项卡的环境,我们需要将表单转换为用户控件,但是这样做时,用户控件的 Loaded
事件会被调用两次。
在搜索互联网时,其他人也指出了这个问题。我们如何确保只调用一次加载事件?因为当它被多次调用时,我们控件的初始化会发生多次。
如同这篇博客所解释的那样,当一个控件即将被呈现(例如添加到可视化树)时,Loaded事件就会触发。
有几个控件可能会导致你的控件多次加载/卸载。例如,原生WPF TabControl只会呈现选定选项卡的内容。因此,当您选择新选项卡时,之前选定选项卡的内容会被卸载。如果你返回到之前选定的选项卡,则它的内容会重新加载。
一种解决方法是使用布尔型变量来标记您是否已经初始化了控件,正如其他人建议的一样。或者,您也可以尝试使用Initialized事件。
你的路由事件处理程序应该在第一时间从Loaded
钩子中移除自己。
public class MyClass : Window
{
public MyClass()
{
Loaded += MyLoadedRoutedEventHandler;
}
void MyLoadedRoutedEventHandler(Object sender, RoutedEventArgs e)
{
Loaded -= MyLoadedRoutedEventHandler;
/// ...
}
};
在事件中设置一个loaded
标志,如果该标志已经被设置,则不执行任何操作。
如上所述,您可以使用布尔标志进行操作。
bool isPageLoadingForFirstTime = true;
public void LoadedEvent()
{
if(ispageLoadingForFirstTime)
{
//do something
ispageLoadingForFirstTime = false;
}
}