PopControlHelper.cs 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using System.Windows;
  7. using System.Windows.Controls;
  8. using System.Windows.Documents;
  9. using System.Windows.Input;
  10. using System.Windows.Media;
  11. using static PDF_Office.CustomControl.ColorDropBox;
  12. namespace PDF_Office.Helper
  13. {
  14. public class AdornerPresenter : Adorner
  15. {
  16. private VisualCollection VisualChildren;
  17. private ContentPresenter Content;
  18. public AdornerPresenter(UIElement adornedElement) : base(adornedElement)
  19. {
  20. VisualChildren = new VisualCollection(this);
  21. Content = new ContentPresenter();
  22. VisualChildren.Add(Content);
  23. }
  24. protected override Size MeasureOverride(Size constraint)
  25. {
  26. Content.Measure(constraint);
  27. return Content.DesiredSize;
  28. }
  29. protected override Size ArrangeOverride(Size finalSize)
  30. {
  31. Content.Arrange(new Rect(0, 0, finalSize.Width, finalSize.Height));
  32. return Content.RenderSize;
  33. }
  34. protected override Visual GetVisualChild(int index)
  35. {
  36. return VisualChildren[index];
  37. }
  38. protected override int VisualChildrenCount
  39. {
  40. get
  41. {
  42. return VisualChildren.Count;
  43. }
  44. }
  45. public object VisualContent
  46. {
  47. get
  48. {
  49. return Content.Content;
  50. }
  51. set
  52. {
  53. Content.Content = value;
  54. }
  55. }
  56. }
  57. //悬浮窗口
  58. //hwnd:鼠标点击区域所在的窗口或控件
  59. //targetPop:悬浮窗口
  60. //offset:位于某窗口的位置,默认为整个主窗口的位置
  61. //Helper.PopControlHelper popControlHelper;
  62. // if (popControlHelper == null)
  63. // popControlHelper = new Helper.PopControlHelper(sender as Control, new CustomControl.CompositeControl.SlidContentPop());
  64. // else
  65. // popControlHelper.UpdatePointOffset(Mouse.GetPosition(App.Current.MainWindow));
  66. // popControlHelper.ShowLayer();
  67. public class PopControlHelper : UserControl
  68. {
  69. private AdornerLayer popLayer;
  70. private AdornerPresenter layerPresent;
  71. private bool layerAdded = false;
  72. private Canvas popCanvas;
  73. private UserControl TargetPop;//悬浮窗口
  74. private Control HwndControl;//悬浮窗口的上一级窗口,即鼠标点击的区域所在的窗口
  75. private Point offset;//悬浮窗口,位于某窗口的位置
  76. public PopControlHelper(Control hwnd, UserControl targetPop, Point offset)
  77. {
  78. this.offset = offset;
  79. HwndControl = hwnd;
  80. TargetPop = targetPop;
  81. InitData();
  82. }
  83. public PopControlHelper(Control hwnd, UserControl targetPop)
  84. {
  85. //默认为主窗口的位置
  86. offset = Mouse.GetPosition(App.Current.MainWindow);
  87. HwndControl = hwnd;
  88. TargetPop = targetPop;
  89. InitData();
  90. }
  91. public void UpdatePointOffset(Point point)
  92. {
  93. offset = point;
  94. }
  95. public void ShowLayer(DependencyObject dependencyObject = null)
  96. {
  97. if (layerAdded)
  98. {
  99. RemoveFromLayer();
  100. return;
  101. }
  102. AddToLayer(dependencyObject);
  103. }
  104. public void RemoveLayer()
  105. {
  106. if (layerAdded)
  107. {
  108. RemoveFromLayer();
  109. return;
  110. }
  111. }
  112. //绑定鼠标点击整个窗口区域的事件
  113. private void InitData()
  114. {
  115. if (popLayer == null)
  116. {
  117. Window parentWnd = Window.GetWindow(HwndControl);
  118. if (parentWnd != null && parentWnd.Content is UIElement && TargetPop != null)
  119. {
  120. parentWnd.AddHandler(MouseDownEvent, new MouseButtonEventHandler((eventsender, param) =>
  121. {
  122. if (layerAdded)
  123. {
  124. try
  125. {
  126. Point p = Mouse.GetPosition(TargetPop);
  127. double width = 0;
  128. double height = 0;
  129. if (double.IsNaN(TargetPop.Width) == false && double.IsNaN(TargetPop.Height) == false)
  130. {
  131. width = TargetPop.Width;
  132. height = TargetPop.Height;
  133. }
  134. else
  135. {
  136. width = TargetPop.ActualWidth;
  137. height = TargetPop.ActualHeight;
  138. }
  139. if (p.X < 0 || p.Y < 0 || p.X > width || p.Y > height)
  140. {
  141. RemoveFromLayer();
  142. }
  143. }
  144. catch (Exception ex)
  145. {
  146. }
  147. }
  148. }), true);
  149. }
  150. }
  151. }
  152. private void AddToLayer(DependencyObject dependencyObject = null)
  153. {
  154. Window parentWnd = Window.GetWindow(HwndControl);
  155. popLayer = AdornerLayer.GetAdornerLayer(parentWnd.Content as UIElement);
  156. if (popLayer != null && TargetPop != null && !layerAdded)
  157. {
  158. if (layerPresent == null)
  159. {
  160. layerPresent = new AdornerPresenter(popLayer);
  161. }
  162. popLayer.Add(layerPresent);
  163. if (popCanvas == null)
  164. {
  165. popCanvas = new Canvas();
  166. popCanvas.Children.Add(TargetPop);
  167. layerPresent.VisualContent = popCanvas;
  168. }
  169. TargetPop.Visibility = Visibility.Visible;
  170. TargetPop.Measure(new Size(parentWnd.ActualWidth, parentWnd.ActualHeight));
  171. TargetPop.SetValue(Canvas.TopProperty, offset.Y + HwndControl.ActualHeight + 2);
  172. if (offset.X + TargetPop.DesiredSize.Width + SystemParameters.ResizeFrameVerticalBorderWidth * 2 > parentWnd.ActualWidth)
  173. {
  174. TargetPop.SetValue(Canvas.LeftProperty, parentWnd.ActualWidth - TargetPop.DesiredSize.Width - 5 - SystemParameters.ResizeFrameVerticalBorderWidth * 2);
  175. }
  176. else
  177. {
  178. TargetPop.SetValue(Canvas.LeftProperty, offset.X);
  179. }
  180. layerAdded = true;
  181. }
  182. }
  183. private void RemoveFromLayer()
  184. {
  185. if (popLayer != null && layerPresent != null && layerAdded)
  186. {
  187. popLayer.Remove(layerPresent);
  188. layerAdded = false;
  189. }
  190. }
  191. }
  192. }