namespace Caliburn.Micro.Core { using System; /// /// Hosts extension methods for classes. /// public static class ScreenExtensions { /// /// Activates the item if it implements , otherwise does nothing. /// /// The potential activatable. public static void TryActivate(object potentialActivatable) { var activator = potentialActivatable as IActivate; if (activator != null) activator.Activate(); } /// /// Deactivates the item if it implements , otherwise does nothing. /// /// The potential deactivatable. /// Indicates whether or not to close the item after deactivating it. public static void TryDeactivate(object potentialDeactivatable, bool close) { var deactivator = potentialDeactivatable as IDeactivate; if (deactivator != null) deactivator.Deactivate(close); } /// /// Closes the specified item. /// /// The conductor. /// The item to close. public static void CloseItem(this IConductor conductor, object item) { conductor.DeactivateItem(item, true); } /// /// Closes the specified item. /// /// The conductor. /// The item to close. public static void CloseItem(this ConductorBase conductor, T item) where T: class { conductor.DeactivateItem(item, true); } /// /// Activates a child whenever the specified parent is activated. /// ///The child to activate. ///The parent whose activation triggers the child's activation. public static void ActivateWith(this IActivate child, IActivate parent) { var childReference = new WeakReference(child); EventHandler handler = null; handler = (s, e) => { var activatable = (IActivate) childReference.Target; if (activatable == null) ((IActivate) s).Activated -= handler; else activatable.Activate(); }; parent.Activated += handler; } /// /// Deactivates a child whenever the specified parent is deactivated. /// ///The child to deactivate. ///The parent whose deactivation triggers the child's deactivation. public static void DeactivateWith(this IDeactivate child, IDeactivate parent) { var childReference = new WeakReference(child); EventHandler handler = null; handler = (s, e) => { var deactivatable = (IDeactivate) childReference.Target; if (deactivatable == null) ((IDeactivate)s).Deactivated -= handler; else deactivatable.Deactivate(e.WasClosed); }; parent.Deactivated += handler; } /// /// Activates and Deactivates a child whenever the specified parent is Activated or Deactivated. /// ///The child to activate/deactivate. ///The parent whose activation/deactivation triggers the child's activation/deactivation. public static void ConductWith(this TChild child, TParent parent) where TChild : IActivate, IDeactivate where TParent : IActivate, IDeactivate { child.ActivateWith(parent); child.DeactivateWith(parent); } } }