【发布时间】:2010-05-10 07:10:19
【问题描述】:
我在将数据绑定到其他人制作的自定义控件的值时遇到了一些困难,所以我在此期间使用“Loaded”事件来分配控件的值,但我注意到这个事件被触发了两次。
如何找出触发该事件的原因? (VS2008)或者可能会出现任何解决方案:)
【问题讨论】:
我在将数据绑定到其他人制作的自定义控件的值时遇到了一些困难,所以我在此期间使用“Loaded”事件来分配控件的值,但我注意到这个事件被触发了两次。
如何找出触发该事件的原因? (VS2008)或者可能会出现任何解决方案:)
【问题讨论】:
每次您的控件可见时,您的 Loaded 事件都会触发(基本上)两次以上。例如,每次切换到其选项卡时,选项卡控件上的控件都会触发其 Loaded 事件。
这是一个简单的解决方案:
bool m_Loaded = false;
void Loaded(object sender, RoutedEventArgs args)
{
bool tmpLoaded = m_Loaded;
m_Loaded = true;
if (tmpLoaded ) return;
// your code here...
}
祝你好运//杰瑞
【讨论】:
Jerry 的回答是每次控件变为可见时都会触发 Loaded 事件的问题的常见转变。
但我更喜欢一种无需持续评估繁琐标志的解决方案:只需在第一次触发事件时从 de 事件中减去处理程序。
此外,通过这种方式,当控件在第一次之后变为可见时,您可以附加另一个处理程序来执行代码。
public UserControl1()
{
InitializeComponent();
Loaded += new RoutedEventHandler(UserControl1FirstTime_Loaded);
}
void UserControl1FirstTime_Loaded(object sender, RoutedEventArgs e)
{
Loaded -= UserControl1FirstTime_Loaded; //This handler not called again
...................
//Add next line if you want code to be executed when de control becomes visible
//after first time.
Loaded +=UserControl1AfterFirstTimes_Loaded;
}
void UserControl1AfterFirstTime_Loaded(object sender, RoutedEventArgs e)
{
//Code to be executed when the control becomes visible after first time
....
}
【讨论】:
正如blog 中所解释的,当即将呈现控件(即添加到可视化树)时会触发 Loaded 事件。
有几个控件会导致您的控件被多次加载/卸载。例如,原生 WPF TabControl 仅呈现所选选项卡的内容。因此,当您选择新选项卡时,会卸载先前选择的选项卡的内容。如果您单击返回到先前选择的选项卡,则会重新加载其内容。
【讨论】: