Hai
имею пользовательский элемент управления WPF, когда я использую то управление в другом окне он загружающийся дважды, таким образом, его исключением выдачи для меня, потому что имею некоторую функцию в usercontrol_loaded событии, когда он загружающий дважды его бросающий ошибку, является там любой другой способ проверить, загружается ли usercontrol как этот, еще как решить эту проблему.
Короче говоря, используйте логический флаг:
private bool firstLoad = true;
private void UserControl_Loaded(object sender, RoutedEventArgs e)
{
if (firstLoad)
{
firstLoad = false;
// Do somthing that want to do only once...
}
}
Более длинная история: По-видимому, в WPF вы не можете предполагать, что загруженное событие запускается только один раз.
Я столкнулся с той же ситуацией при использовании пользовательского элемента управления в Tabitem. Каждый раз, когда вы активируете Tabitem, выбирая его, загружаемое событие запускается для всех элементов управления в этом tabitem.
Ура
Да, я нахожу такое поведение действительно странным. В конечном итоге я думаю, что то, что сказал Hertzel, является лучшим способом решения этой проблемы, или создание нового класса UserControl, как например:
Вы можете создать производный класс от LoadOnceUserControl, и его событие FirstLoaded будет вызываться только один раз.
using System.Windows;
using System.Windows.Controls;
public class LoadOnceUserControl : UserControl
{
private bool firstLoadCalled = false;
public LoadOnceUserControl()
{
// Hook up our loaded event
this.Loaded += new RoutedEvent(delegate(object sender, RoutedEventArgs e)
{
// If FirstLoad hasn't been called and there are events to be called...
if (!this.firstLoadCalled && this.FirstLoaded != null)
{
this.FirstLoaded(sender, e);
}
// We've already called (or attempted to call) FirstLoad.
this.firstLoadCalled = true;
});
}
event RoutedEventHandler FirstLoaded;
}