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