2010-07-21 30 views

回答

29

不幸的是,沒有這樣的事件。您可以使用布爾在載入的方法,以確保你的東西只觸發一次 -

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

+6

那麼這是愚蠢的,我不應該使用這樣的警衛子句。但這是正確的答案,所以這是你的觀點。 – 2010-07-21 20:12:42

+1

同意 - 你可以創建自己的窗口類繼承窗口,並在整個項目中實現一個事件,如果這是你經常做的事情。 – brendan 2010-07-21 20:52:44

+2

另請參閱:http://blogs.msdn.com/b/mikehillberg/archive/2006/09/19/loadedvsinitialized.aspx – 2012-05-09 15:28:38

5

或者到存儲一個布爾標誌,你可以使用擴展方法和委託打包僞造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) 
    { 
    } 
} 
相關問題