TransformExtentions.cs 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. /*************************************************************************************
  2. Extended WPF Toolkit
  3. Copyright (C) 2007-2013 Xceed Software Inc.
  4. This program is provided to you under the terms of the Microsoft Public
  5. License (Ms-PL) as published at http://wpftoolkit.codeplex.com/license
  6. For more features, controls, and fast professional support,
  7. pick up the Plus Edition at http://xceed.com/wpf_toolkit
  8. Stay informed: follow @datagrid on Twitter or Like http://facebook.com/datagrids
  9. ***********************************************************************************/
  10. using System;
  11. using System.Collections.Generic;
  12. using System.Linq;
  13. using System.Text;
  14. using System.Windows;
  15. using System.Windows.Media;
  16. namespace Xceed.Wpf.AvalonDock.Controls
  17. {
  18. internal static class TransformExtensions
  19. {
  20. public static Point PointToScreenDPI(this Visual visual, Point pt)
  21. {
  22. Point resultPt = visual.PointToScreen(pt);
  23. return TransformToDeviceDPI(visual, resultPt);
  24. }
  25. public static Point PointToScreenDPIWithoutFlowDirection(this FrameworkElement element, Point point)
  26. {
  27. if (FrameworkElement.GetFlowDirection(element) == FlowDirection.RightToLeft)
  28. {
  29. var actualSize = element.TransformActualSizeToAncestor();
  30. Point leftToRightPoint = new Point(
  31. actualSize.Width - point.X,
  32. point.Y);
  33. return element.PointToScreenDPI(leftToRightPoint);
  34. }
  35. return element.PointToScreenDPI(point);
  36. }
  37. public static Rect GetScreenArea(this FrameworkElement element)
  38. {
  39. // return new Rect(element.PointToScreenDPI(new Point()),
  40. // element.TransformActualSizeToAncestor());
  41. //}
  42. //public static Rect GetScreenAreaWithoutFlowDirection(this FrameworkElement element)
  43. //{
  44. var point = element.PointToScreenDPI(new Point());
  45. if (FrameworkElement.GetFlowDirection(element) == FlowDirection.RightToLeft)
  46. {
  47. var actualSize = element.TransformActualSizeToAncestor();
  48. Point leftToRightPoint = new Point(
  49. actualSize.Width - point.X,
  50. point.Y);
  51. return new Rect(leftToRightPoint,
  52. actualSize);
  53. }
  54. return new Rect(point,
  55. element.TransformActualSizeToAncestor());
  56. }
  57. public static Point TransformToDeviceDPI(this Visual visual, Point pt)
  58. {
  59. Matrix m = PresentationSource.FromVisual(visual).CompositionTarget.TransformToDevice;
  60. return new Point(pt.X / m.M11, pt.Y / m.M22);
  61. }
  62. public static Size TransformFromDeviceDPI(this Visual visual, Size size)
  63. {
  64. Matrix m = PresentationSource.FromVisual(visual).CompositionTarget.TransformToDevice;
  65. return new Size(size.Width * m.M11, size.Height * m.M22);
  66. }
  67. public static Point TransformFromDeviceDPI(this Visual visual, Point pt)
  68. {
  69. Matrix m = PresentationSource.FromVisual(visual).CompositionTarget.TransformToDevice;
  70. return new Point(pt.X * m.M11, pt.Y * m.M22);
  71. }
  72. public static bool CanTransform(this Visual visual)
  73. {
  74. return PresentationSource.FromVisual(visual) != null;
  75. }
  76. public static Size TransformActualSizeToAncestor(this FrameworkElement element)
  77. {
  78. if (PresentationSource.FromVisual(element) == null)
  79. return new Size(element.ActualWidth, element.ActualHeight);
  80. var parentWindow = PresentationSource.FromVisual(element).RootVisual;
  81. var transformToWindow = element.TransformToAncestor(parentWindow);
  82. return transformToWindow.TransformBounds(new Rect(0, 0, element.ActualWidth, element.ActualHeight)).Size;
  83. }
  84. public static Size TransformSizeToAncestor(this FrameworkElement element, Size sizeToTransform)
  85. {
  86. if (PresentationSource.FromVisual(element) == null)
  87. return sizeToTransform;
  88. var parentWindow = PresentationSource.FromVisual(element).RootVisual;
  89. var transformToWindow = element.TransformToAncestor(parentWindow);
  90. return transformToWindow.TransformBounds(new Rect(0, 0, sizeToTransform.Width, sizeToTransform.Height)).Size;
  91. }
  92. public static GeneralTransform TansformToAncestor(this FrameworkElement element)
  93. {
  94. if (PresentationSource.FromVisual(element) == null)
  95. return new MatrixTransform(Matrix.Identity);
  96. var parentWindow = PresentationSource.FromVisual(element).RootVisual;
  97. return element.TransformToAncestor(parentWindow);
  98. }
  99. }
  100. }