要在 WPF 中实现基于标签的环境,我们需要将表单转换为用户控件,但是在执行此操作时,用户控件的Loaded
事件称为两次。
在互联网上搜索时,其他人也指出了这个问题。我们怎样才能确保只调用一次加载的事件?因为当它被多次调用时,我们的控件的初始化会多次发生。
答案 0 :(得分:38)
如此blog中所述,当即将呈现控件(即添加到可视树)时,会触发Loaded事件。
有几个控件会导致您的控件多次加载/卸载。例如,本机WPF TabControl仅呈现所选选项卡的内容。因此,当您选择新选项卡时,将卸载先前选定选项卡的内容。如果单击返回先前选择的选项卡,则会重新加载内容。
一种解决方法是使用布尔值来标记您是否已经按照其他人的建议初始化了控件。或者,您也可以使用Initialized事件。
答案 1 :(得分:15)
您的路由事件处理程序可以(并且应该)从Loaded
挂钩中删除它自己的第一件事。
public class MyClass : Window
{
public MyClass()
{
Loaded += MyLoadedRoutedEventHandler;
}
void MyLoadedRoutedEventHandler(Object sender, RoutedEventArgs e)
{
Loaded -= MyLoadedRoutedEventHandler;
/// ...
}
};
答案 2 :(得分:2)
在事件中设置loaded
标志,如果已设置标志,则不要执行任何操作。