WPF: что происходит между событием Initialized и Loaded?
Я хочу запустить некоторый код, когда сначала отображается окно или элемент управления. Я не могу использовать Loaded, потому что это может срабатывать более одного раза. Я не могу использовать Initialized, потому что это делается конструктором.
Есть ли какое-то событие где-то между?
Ответы
Ответ 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;
}