WPF: Что находится между событием Initialized и Loaded? - PullRequest
21 голосов
/ 21 июля 2010

Я хочу запустить некоторый код при первом отображении окна или элемента управления.Я не могу использовать Loaded, потому что он может срабатывать более одного раза.Я не могу использовать Initialized, потому что это делается конструктором.

Есть ли событие где-то между?

Ответы [ 3 ]

30 голосов
/ 21 июля 2010

К сожалению, такого события нет.Вы можете использовать логическое значение в методе Loaded, чтобы убедиться, что ваши вещи запускаются только один раз -

if(!IsSetUp)
{
   MySetUpFunction();
   IsSetUp = true;
}

Здесь вы можете посмотреть события жизни WPF Windows:

http://msdn.microsoft.com/en-us/library/ms748948.aspx#Window_Lifetime_Events

альтернативный текст http://i.msdn.microsoft.com/dynimg/IC155674.png

6 голосов
/ 18 октября 2014

В качестве альтернативы хранению логического флага вы можете использовать метод расширения и делегировать перенос для фальсификации Loaded только один раз.

public static void OnLoadedOnce(
    this UserControl control,
    RoutedEventHandler onLoaded)
{
    if (control == null || onLoaded == null)
    {
        throw new ArgumentNullException();
    }

    RoutedEventHandler wrappedOnLoaded = null;
    wrappedOnLoaded = delegate(object sender, RoutedEventArgs e)
    {
        control.Loaded -= wrappedOnLoaded;
        onLoaded(sender, e);
    };
    control.Loaded += wrappedOnLoaded;
}

...

class MyControl : UserControl
{
    public MyControl()
    { 
        InitializeComponent();
        this.OnLoadedOnce(this.OnControlLoaded /* or delegate {...} */);
    }

    private void OnControlLoaded(object sender, RoutedEventArgs e)
    {
    }
}
1 голос
/ 05 июля 2019

Если вы не хотите использовать логический метод выполнения действий, вы можете создать метод и подписаться на него с событием Loaded, а затем отменить подписку в конце этого метода.

Пример:

public MyDependencyObject(){
  Loaded += OnLoaded;
}

private void OnLoaded(object sender, EventArgs args){
  DoThings();
  Loaded -= OnLoaded;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...