Пользовательский элемент управления WPF, загружающийся дважды

Hai

имею пользовательский элемент управления WPF, когда я использую то управление в другом окне он загружающийся дважды, таким образом, его исключением выдачи для меня, потому что имею некоторую функцию в usercontrol_loaded событии, когда он загружающий дважды его бросающий ошибку, является там любой другой способ проверить, загружается ли usercontrol как этот, еще как решить эту проблему.

5
задан Spen D 17 March 2010 в 08:17
поделиться

2 ответа

Короче говоря, используйте логический флаг:

    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.

Ура

7
ответ дан 18 December 2019 в 07:54
поделиться

Да, я нахожу такое поведение действительно странным. В конечном итоге я думаю, что то, что сказал 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;
}
0
ответ дан 18 December 2019 в 07:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: