I want to run some code when the Window or Control is first displayed. I can\'t use Loaded because that can fire more than once. I can\'t use Initialized because that is done by
Alternatively to storing a boolean flag, you can use an extension method and delegate wrapping to fake Loaded
only firing once.
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)
{
}
}
If you don't want to use the boolean method of doing things, then you can create a method and subscribe to the Loaded
event with it, then unsubscribe at the end of that method.
Example:
public MyDependencyObject(){
Loaded += OnLoaded;
}
private void OnLoaded(object sender, EventArgs args){
DoThings();
Loaded -= OnLoaded;
}
Unfortunately there is no such event. You can use a boolean in the Loaded Method to make sure your stuff only fires once -
if(!IsSetUp)
{
MySetUpFunction();
IsSetUp = true;
}
Check out the WPF Windows lifetime events here:
http://msdn.microsoft.com/en-us/library/ms748948.aspx#Window_Lifetime_Events
(source: microsoft.com)