Подтвердить что ты не робот

WPF: что происходит между событием Initialized и Loaded?

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

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

4b9b3361

Ответ 1

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

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

Ознакомьтесь с событиями жизни WPF Windows здесь:

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

alt text http://i.msdn.microsoft.com/dynimg/IC155674.png

Ответ 2

В качестве альтернативы для хранения логического флага вы можете использовать метод расширения и делегировать обертку для подделки 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)
    {
    }
}

Ответ 3

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

Пример:

public MyDependencyObject(){
  Loaded += OnLoaded;
}

private void OnLoaded(object sender, EventArgs args){
  DoThings();
  Loaded -= OnLoaded;
}