PopupMenu.xaml.cs 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268
  1. using MuchInfo.Chart.Infrastructure.Helpers;
  2. using System;
  3. using System.Windows;
  4. using System.Windows.Controls;
  5. using System.Windows.Controls.Primitives;
  6. using System.Windows.Input;
  7. using System.Windows.Media;
  8. namespace MuchInfo.Chart.WPF.Controls.Utilities
  9. {
  10. /// <summary>
  11. /// PopupMenu.xaml 的交互逻辑
  12. /// </summary>
  13. public partial class PopupMenu : UserControl
  14. {
  15. #region Fields
  16. private static Popup _cachPopup;
  17. private Popup _Popup;
  18. private Panel _popupRoot;
  19. #endregion Fields
  20. #region Constructors
  21. public PopupMenu(Panel popupRoot)
  22. {
  23. _popupRoot = popupRoot;
  24. this.InitializeComponent();
  25. this.Padding = new Thickness(5.0);
  26. this.MouseLeftButtonDown -= PopupMenu_MouseLeftButtonDown;
  27. this.MouseLeftButtonDown += PopupMenu_MouseLeftButtonDown;
  28. }
  29. #endregion Constructors
  30. #region Delegates
  31. public delegate void PopupClosedEventHandler();
  32. #endregion Delegates
  33. #region Events
  34. public event PopupMenu.PopupClosedEventHandler PopupClosed;
  35. #endregion Events
  36. #region Properties
  37. #region Public Properties
  38. public virtual Popup Popup
  39. {
  40. get
  41. {
  42. return this._Popup;
  43. }
  44. set
  45. {
  46. var eventHandler = new EventHandler(this.Popup_Closed);
  47. bool flag = this._Popup != null;
  48. if (flag)
  49. {
  50. this._Popup.Closed -= eventHandler;
  51. }
  52. this._Popup = value;
  53. flag = (this._Popup != null);
  54. if (flag)
  55. {
  56. this._Popup.Closed += eventHandler;
  57. }
  58. }
  59. }
  60. #endregion Public Properties
  61. #endregion Properties
  62. #region Methods
  63. #region Public Static Methods
  64. public static bool MenuIsUp()
  65. {
  66. return PopupMenu._cachPopup != null;
  67. }
  68. #endregion Public Static Methods
  69. #region Public Methods
  70. public void AddItem(string txt, ImageSource image, EventHandler onClick)
  71. {
  72. var chartMenuItem = new ChartMenuItem(txt, image, onClick);
  73. chartMenuItem.SetPopupMenu(this);
  74. this.MainStack.Children.Add(chartMenuItem);
  75. }
  76. public void AddItem(string txt, EventHandler onClick)
  77. {
  78. var chartMenuItem = new ChartMenuItem(txt, onClick);
  79. chartMenuItem.SetPopupMenu(this);
  80. this.MainStack.Children.Add(chartMenuItem);
  81. }
  82. public void AddItem(ChartMenuItem item)
  83. {
  84. item.SetPopupMenu(this);
  85. this.MainStack.Children.Add(item);
  86. }
  87. public void AddSeperator()
  88. {
  89. var seperator = new ChartMenuSeperator();
  90. this.MainStack.Children.Add(seperator);
  91. }
  92. public void Show(MouseEventArgs aPos)
  93. {
  94. var offset = new Point(0.0, 0.0);
  95. this.Show(aPos, offset);
  96. }
  97. public void Show(Point aPos)
  98. {
  99. if (PopupMenu._cachPopup != null)
  100. {
  101. PopupMenu._cachPopup.IsOpen = false;
  102. }
  103. this.Popup = PopupManager.CreateOverlay(_popupRoot);
  104. this.Popup.Child = this;
  105. this.Popup.HorizontalOffset = aPos.X;
  106. this.Popup.VerticalOffset = aPos.Y;
  107. this.Popup.IsOpen = true;
  108. this.InvalidateArrange();
  109. this.UpdateLayout();
  110. GeometryHelper.EnsureControlInApplication(this.Popup, _popupRoot);
  111. PopupMenu._cachPopup = this.Popup;
  112. this.MoveLeaveMenuItem();
  113. }
  114. public void Show(FrameworkElement relativeTo)
  115. {
  116. bool flag = PopupMenu._cachPopup != null;
  117. if (flag)
  118. {
  119. PopupMenu._cachPopup.IsOpen = false;
  120. }
  121. this.Popup = PopupManager.CreateOverlay(_popupRoot);
  122. PopupManager.MovePopup(this.Popup, relativeTo, PopupManager.RelativePositionHoriz.FlushLefts, PopupManager.RelativePositionVert.Below, _popupRoot);
  123. this.Popup.Child = this;
  124. this.Popup.IsOpen = true;
  125. this.InvalidateArrange();
  126. this.UpdateLayout();
  127. GeometryHelper.EnsureControlInApplication(this.Popup, _popupRoot);
  128. PopupMenu._cachPopup = this.Popup;
  129. this.MoveLeaveMenuItem();
  130. }
  131. public void Show(MouseEventArgs aPos, Point offset)
  132. {
  133. if (PopupMenu._cachPopup != null)
  134. {
  135. PopupMenu._cachPopup.IsOpen = false;
  136. }
  137. this.Popup = PopupManager.CreateOverlay(aPos, _popupRoot);
  138. this.Popup.Child = this;
  139. this.Popup.IsOpen = true;
  140. this.InvalidateArrange();
  141. this.UpdateLayout();
  142. GeometryHelper.EnsureControlInApplication(this.Popup, _popupRoot);
  143. PopupMenu._cachPopup = this.Popup;
  144. this.MoveLeaveMenuItem();
  145. }
  146. //public void ShowMainMenu(MainMenuButton MainMenuCtl)
  147. //{
  148. // bool flag = PopupMenu._cachPopup != null;
  149. // if (flag)
  150. // {
  151. // PopupMenu._cachPopup.IsOpen = (false);
  152. // }
  153. // this.Popup = PopupManager.CreateAppOverlay();
  154. // this.Popup.Child = this;
  155. // this.Popup.IsOpen = true;
  156. // this.Popup.InvalidateArrange();
  157. // this.Popup.UpdateLayout();
  158. // PopupManager.MovePopup(this.Popup, MainMenuCtl, PopupManager.RelativePositionHoriz.FlushLefts, PopupManager.RelativePositionVert.Below);
  159. // GeometryHelper.EnsureControlInApplication(this.Popup);
  160. // PopupMenu._cachPopup = this.Popup;
  161. // this.MoveLeaveMenuItem();
  162. //}
  163. #endregion Public Methods
  164. #region Internal Methods
  165. internal void ClosePopup()
  166. {
  167. if (this.Popup != null)
  168. {
  169. this.Popup.IsOpen = false;
  170. }
  171. }
  172. #endregion Internal Methods
  173. #region Protected Methods
  174. protected virtual void OnPopupClosed()
  175. {
  176. var handler = PopupClosed;
  177. if (handler != null) handler();
  178. }
  179. #endregion Protected Methods
  180. #region Private Methods
  181. private void MoveLeaveMenuItem()
  182. {
  183. var children = this.MainStack.Children;
  184. if (children == null || children.Count == 0) return;
  185. foreach (var child in children)
  186. {
  187. var current = child as ChartMenuItem;
  188. if (current == null) continue;
  189. current.HideHover();
  190. }
  191. }
  192. private void PopupMenu_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
  193. {
  194. //中断事件冒泡, 单击左键不触发你容器事件
  195. //主要是为了单击popup其它地方时关闭popup.- Popupmanager.cs: Root_MouseLeftButtonDown
  196. e.Handled = true;
  197. }
  198. private void Popup_Closed(object sender, EventArgs e)
  199. {
  200. OnPopupClosed();
  201. var flag = (PopupMenu._cachPopup == this.Popup);
  202. if (flag)
  203. {
  204. PopupMenu._cachPopup = null;
  205. }
  206. this.Popup = null;
  207. }
  208. #endregion Private Methods
  209. #endregion Methods
  210. }
  211. }