ScreenExtensions.cs 4.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. namespace Caliburn.Micro.Core {
  2. using System;
  3. /// <summary>
  4. /// Hosts extension methods for <see cref="IScreen"/> classes.
  5. /// </summary>
  6. public static class ScreenExtensions {
  7. /// <summary>
  8. /// Activates the item if it implements <see cref="IActivate"/>, otherwise does nothing.
  9. /// </summary>
  10. /// <param name="potentialActivatable">The potential activatable.</param>
  11. public static void TryActivate(object potentialActivatable) {
  12. var activator = potentialActivatable as IActivate;
  13. if (activator != null)
  14. activator.Activate();
  15. }
  16. /// <summary>
  17. /// Deactivates the item if it implements <see cref="IDeactivate"/>, otherwise does nothing.
  18. /// </summary>
  19. /// <param name="potentialDeactivatable">The potential deactivatable.</param>
  20. /// <param name="close">Indicates whether or not to close the item after deactivating it.</param>
  21. public static void TryDeactivate(object potentialDeactivatable, bool close) {
  22. var deactivator = potentialDeactivatable as IDeactivate;
  23. if (deactivator != null)
  24. deactivator.Deactivate(close);
  25. }
  26. /// <summary>
  27. /// Closes the specified item.
  28. /// </summary>
  29. /// <param name="conductor">The conductor.</param>
  30. /// <param name="item">The item to close.</param>
  31. public static void CloseItem(this IConductor conductor, object item) {
  32. conductor.DeactivateItem(item, true);
  33. }
  34. /// <summary>
  35. /// Closes the specified item.
  36. /// </summary>
  37. /// <param name="conductor">The conductor.</param>
  38. /// <param name="item">The item to close.</param>
  39. public static void CloseItem<T>(this ConductorBase<T> conductor, T item) where T: class {
  40. conductor.DeactivateItem(item, true);
  41. }
  42. ///<summary>
  43. /// Activates a child whenever the specified parent is activated.
  44. ///</summary>
  45. ///<param name="child">The child to activate.</param>
  46. ///<param name="parent">The parent whose activation triggers the child's activation.</param>
  47. public static void ActivateWith(this IActivate child, IActivate parent) {
  48. var childReference = new WeakReference(child);
  49. EventHandler<ActivationEventArgs> handler = null;
  50. handler = (s, e) => {
  51. var activatable = (IActivate) childReference.Target;
  52. if (activatable == null)
  53. ((IActivate) s).Activated -= handler;
  54. else
  55. activatable.Activate();
  56. };
  57. parent.Activated += handler;
  58. }
  59. ///<summary>
  60. /// Deactivates a child whenever the specified parent is deactivated.
  61. ///</summary>
  62. ///<param name="child">The child to deactivate.</param>
  63. ///<param name="parent">The parent whose deactivation triggers the child's deactivation.</param>
  64. public static void DeactivateWith(this IDeactivate child, IDeactivate parent) {
  65. var childReference = new WeakReference(child);
  66. EventHandler<DeactivationEventArgs> handler = null;
  67. handler = (s, e) => {
  68. var deactivatable = (IDeactivate) childReference.Target;
  69. if (deactivatable == null)
  70. ((IDeactivate)s).Deactivated -= handler;
  71. else
  72. deactivatable.Deactivate(e.WasClosed);
  73. };
  74. parent.Deactivated += handler;
  75. }
  76. ///<summary>
  77. /// Activates and Deactivates a child whenever the specified parent is Activated or Deactivated.
  78. ///</summary>
  79. ///<param name="child">The child to activate/deactivate.</param>
  80. ///<param name="parent">The parent whose activation/deactivation triggers the child's activation/deactivation.</param>
  81. public static void ConductWith<TChild, TParent>(this TChild child, TParent parent)
  82. where TChild : IActivate, IDeactivate
  83. where TParent : IActivate, IDeactivate
  84. {
  85. child.ActivateWith(parent);
  86. child.DeactivateWith(parent);
  87. }
  88. }
  89. }