| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268 |
- using MuchInfo.Chart.Infrastructure.Helpers;
- using System;
- using System.Windows;
- using System.Windows.Controls;
- using System.Windows.Controls.Primitives;
- using System.Windows.Input;
- using System.Windows.Media;
- namespace MuchInfo.Chart.WPF.Controls.Utilities
- {
- /// <summary>
- /// PopupMenu.xaml 的交互逻辑
- /// </summary>
- public partial class PopupMenu : UserControl
- {
- #region Fields
- private static Popup _cachPopup;
- private Popup _Popup;
- private Panel _popupRoot;
- #endregion Fields
- #region Constructors
- public PopupMenu(Panel popupRoot)
- {
- _popupRoot = popupRoot;
- this.InitializeComponent();
- this.Padding = new Thickness(5.0);
- this.MouseLeftButtonDown -= PopupMenu_MouseLeftButtonDown;
- this.MouseLeftButtonDown += PopupMenu_MouseLeftButtonDown;
- }
- #endregion Constructors
- #region Delegates
- public delegate void PopupClosedEventHandler();
- #endregion Delegates
- #region Events
- public event PopupMenu.PopupClosedEventHandler PopupClosed;
- #endregion Events
- #region Properties
- #region Public Properties
- public virtual Popup Popup
- {
- get
- {
- return this._Popup;
- }
- set
- {
- var eventHandler = new EventHandler(this.Popup_Closed);
- bool flag = this._Popup != null;
- if (flag)
- {
- this._Popup.Closed -= eventHandler;
- }
- this._Popup = value;
- flag = (this._Popup != null);
- if (flag)
- {
- this._Popup.Closed += eventHandler;
- }
- }
- }
- #endregion Public Properties
- #endregion Properties
- #region Methods
- #region Public Static Methods
- public static bool MenuIsUp()
- {
- return PopupMenu._cachPopup != null;
- }
- #endregion Public Static Methods
- #region Public Methods
- public void AddItem(string txt, ImageSource image, EventHandler onClick)
- {
- var chartMenuItem = new ChartMenuItem(txt, image, onClick);
- chartMenuItem.SetPopupMenu(this);
- this.MainStack.Children.Add(chartMenuItem);
- }
- public void AddItem(string txt, EventHandler onClick)
- {
- var chartMenuItem = new ChartMenuItem(txt, onClick);
- chartMenuItem.SetPopupMenu(this);
- this.MainStack.Children.Add(chartMenuItem);
- }
- public void AddItem(ChartMenuItem item)
- {
- item.SetPopupMenu(this);
- this.MainStack.Children.Add(item);
- }
- public void AddSeperator()
- {
- var seperator = new ChartMenuSeperator();
- this.MainStack.Children.Add(seperator);
- }
- public void Show(MouseEventArgs aPos)
- {
- var offset = new Point(0.0, 0.0);
- this.Show(aPos, offset);
- }
- public void Show(Point aPos)
- {
- if (PopupMenu._cachPopup != null)
- {
- PopupMenu._cachPopup.IsOpen = false;
- }
- this.Popup = PopupManager.CreateOverlay(_popupRoot);
- this.Popup.Child = this;
- this.Popup.HorizontalOffset = aPos.X;
- this.Popup.VerticalOffset = aPos.Y;
- this.Popup.IsOpen = true;
- this.InvalidateArrange();
- this.UpdateLayout();
- GeometryHelper.EnsureControlInApplication(this.Popup, _popupRoot);
- PopupMenu._cachPopup = this.Popup;
- this.MoveLeaveMenuItem();
- }
- public void Show(FrameworkElement relativeTo)
- {
- bool flag = PopupMenu._cachPopup != null;
- if (flag)
- {
- PopupMenu._cachPopup.IsOpen = false;
- }
- this.Popup = PopupManager.CreateOverlay(_popupRoot);
- PopupManager.MovePopup(this.Popup, relativeTo, PopupManager.RelativePositionHoriz.FlushLefts, PopupManager.RelativePositionVert.Below, _popupRoot);
- this.Popup.Child = this;
- this.Popup.IsOpen = true;
- this.InvalidateArrange();
- this.UpdateLayout();
- GeometryHelper.EnsureControlInApplication(this.Popup, _popupRoot);
- PopupMenu._cachPopup = this.Popup;
- this.MoveLeaveMenuItem();
- }
- public void Show(MouseEventArgs aPos, Point offset)
- {
- if (PopupMenu._cachPopup != null)
- {
- PopupMenu._cachPopup.IsOpen = false;
- }
- this.Popup = PopupManager.CreateOverlay(aPos, _popupRoot);
- this.Popup.Child = this;
- this.Popup.IsOpen = true;
- this.InvalidateArrange();
- this.UpdateLayout();
- GeometryHelper.EnsureControlInApplication(this.Popup, _popupRoot);
- PopupMenu._cachPopup = this.Popup;
- this.MoveLeaveMenuItem();
- }
- //public void ShowMainMenu(MainMenuButton MainMenuCtl)
- //{
- // bool flag = PopupMenu._cachPopup != null;
- // if (flag)
- // {
- // PopupMenu._cachPopup.IsOpen = (false);
- // }
- // this.Popup = PopupManager.CreateAppOverlay();
- // this.Popup.Child = this;
- // this.Popup.IsOpen = true;
- // this.Popup.InvalidateArrange();
- // this.Popup.UpdateLayout();
- // PopupManager.MovePopup(this.Popup, MainMenuCtl, PopupManager.RelativePositionHoriz.FlushLefts, PopupManager.RelativePositionVert.Below);
- // GeometryHelper.EnsureControlInApplication(this.Popup);
- // PopupMenu._cachPopup = this.Popup;
- // this.MoveLeaveMenuItem();
- //}
- #endregion Public Methods
- #region Internal Methods
- internal void ClosePopup()
- {
- if (this.Popup != null)
- {
- this.Popup.IsOpen = false;
- }
- }
- #endregion Internal Methods
- #region Protected Methods
- protected virtual void OnPopupClosed()
- {
- var handler = PopupClosed;
- if (handler != null) handler();
- }
- #endregion Protected Methods
- #region Private Methods
- private void MoveLeaveMenuItem()
- {
- var children = this.MainStack.Children;
- if (children == null || children.Count == 0) return;
- foreach (var child in children)
- {
- var current = child as ChartMenuItem;
- if (current == null) continue;
- current.HideHover();
- }
- }
- private void PopupMenu_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
- {
- //中断事件冒泡, 单击左键不触发你容器事件
- //主要是为了单击popup其它地方时关闭popup.- Popupmanager.cs: Root_MouseLeftButtonDown
- e.Handled = true;
- }
- private void Popup_Closed(object sender, EventArgs e)
- {
- OnPopupClosed();
- var flag = (PopupMenu._cachPopup == this.Popup);
- if (flag)
- {
- PopupMenu._cachPopup = null;
- }
- this.Popup = null;
- }
- #endregion Private Methods
- #endregion Methods
- }
- }
|