Paradox Game Engine  v1.0.0 beta06
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Events Macros Pages
DeferredBehaviorBase.cs
Go to the documentation of this file.
1 // Copyright (c) 2014 Silicon Studio Corp. (http://siliconstudio.co.jp)
2 // This file is distributed under GPL v3. See LICENSE.md for details.
3 using System.Windows;
4 using System.Windows.Interactivity;
5 
6 namespace SiliconStudio.Presentation.Behaviors
7 {
8  /// <summary>
9  /// A <see cref="Behavior{T}"/> that support deferred attachement for a FrameworkElement derived class.
10  /// In such a case, the attachement is delayed until the OnLoad event is raised.
11  /// </summary>
12  /// <typeparam name="T">The type of instance to attach to.</typeparam>
13  public abstract class DeferredBehaviorBase<T> : Behavior<T> where T : DependencyObject
14  {
15  private bool isClean;
16 
17  protected override sealed void OnAttached()
18  {
19  base.OnAttached();
20 
21  isClean = false;
22  var element = AssociatedObject as FrameworkElement;
23 
24  if (element == null)
25  OnAttachedOverride();
26  else
27  {
28  if (element.IsLoaded)
29  OnAttachedOverride();
30  else
31  element.Loaded += OnAssociatedObjectLoaded;
32 
33  element.Unloaded += OnAssociatedObjectUnloaded;
34  }
35  }
36 
37  protected override sealed void OnDetaching()
38  {
39  base.OnDetaching();
40 
41  CleanUp();
42  }
43 
44  private void OnAssociatedObjectLoaded(object sender, RoutedEventArgs e)
45  {
46  OnAttachedOverride();
47  ((FrameworkElement)sender).Loaded -= OnAssociatedObjectLoaded;
48  }
49 
50  private void OnAssociatedObjectUnloaded(object sender, RoutedEventArgs e)
51  {
52  CleanUp();
53  }
54 
55  private void CleanUp()
56  {
57  if (isClean)
58  return;
59 
60  isClean = true;
61 
62  var element = AssociatedObject as FrameworkElement;
63  if (element != null)
64  {
65  element.Loaded += OnAssociatedObjectLoaded;
66  element.Unloaded -= OnAssociatedObjectUnloaded;
67  }
68 
69  OnDetachingOverride();
70  }
71 
72  protected virtual void OnAttachedOverride()
73  {
74 
75  }
76 
77  protected virtual void OnDetachingOverride()
78  {
79 
80  }
81  }
82 }