WindowChrome.cs 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Diagnostics.CodeAnalysis;
  5. using System.Windows;
  6. using System.Windows.Data;
  7. using Standard;
  8. namespace Microsoft.Windows.Shell;
  9. public class WindowChrome : Freezable
  10. {
  11. public static Thickness GlassFrameCompleteThickness
  12. {
  13. get
  14. {
  15. return new Thickness(-1.0);
  16. }
  17. }
  18. private static void _OnChromeChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
  19. {
  20. if (DesignerProperties.GetIsInDesignMode(d))
  21. {
  22. return;
  23. }
  24. Window window = (Window) d;
  25. WindowChrome windowChrome = (WindowChrome) e.NewValue;
  26. WindowChromeWorker windowChromeWorker = WindowChromeWorker.GetWindowChromeWorker(window);
  27. if (windowChromeWorker == null)
  28. {
  29. windowChromeWorker = new WindowChromeWorker();
  30. WindowChromeWorker.SetWindowChromeWorker(window, windowChromeWorker);
  31. }
  32. windowChromeWorker.SetWindowChrome(windowChrome);
  33. }
  34. [SuppressMessage("Microsoft.Design", "CA1011:ConsiderPassingBaseTypesAsParameters")]
  35. [SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "0")]
  36. public static WindowChrome GetWindowChrome(Window window)
  37. {
  38. Verify.IsNotNull<Window>(window, "window");
  39. return (WindowChrome) window.GetValue(WindowChrome.WindowChromeProperty);
  40. }
  41. [SuppressMessage("Microsoft.Design", "CA1011:ConsiderPassingBaseTypesAsParameters")]
  42. [SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "0")]
  43. public static void SetWindowChrome(Window window, WindowChrome chrome)
  44. {
  45. Verify.IsNotNull<Window>(window, "window");
  46. window.SetValue(WindowChrome.WindowChromeProperty, chrome);
  47. }
  48. [SuppressMessage("Microsoft.Design", "CA1011:ConsiderPassingBaseTypesAsParameters")]
  49. [SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "0")]
  50. public static bool GetIsHitTestVisibleInChrome(IInputElement inputElement)
  51. {
  52. Verify.IsNotNull<IInputElement>(inputElement, "inputElement");
  53. DependencyObject dependencyObject = inputElement as DependencyObject;
  54. if (dependencyObject == null)
  55. {
  56. throw new ArgumentException("The element must be a DependencyObject", "inputElement");
  57. }
  58. return (bool) dependencyObject.GetValue(WindowChrome.IsHitTestVisibleInChromeProperty);
  59. }
  60. [SuppressMessage("Microsoft.Design", "CA1011:ConsiderPassingBaseTypesAsParameters")]
  61. [SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "0")]
  62. public static void SetIsHitTestVisibleInChrome(IInputElement inputElement, bool hitTestVisible)
  63. {
  64. Verify.IsNotNull<IInputElement>(inputElement, "inputElement");
  65. DependencyObject dependencyObject = inputElement as DependencyObject;
  66. if (dependencyObject == null)
  67. {
  68. throw new ArgumentException("The element must be a DependencyObject", "inputElement");
  69. }
  70. dependencyObject.SetValue(WindowChrome.IsHitTestVisibleInChromeProperty, hitTestVisible);
  71. }
  72. public double CaptionHeight
  73. {
  74. get
  75. {
  76. return (double) base.GetValue(WindowChrome.CaptionHeightProperty);
  77. }
  78. set
  79. {
  80. base.SetValue(WindowChrome.CaptionHeightProperty, value);
  81. }
  82. }
  83. public Thickness ResizeBorderThickness
  84. {
  85. get
  86. {
  87. return (Thickness) base.GetValue(WindowChrome.ResizeBorderThicknessProperty);
  88. }
  89. set
  90. {
  91. base.SetValue(WindowChrome.ResizeBorderThicknessProperty, value);
  92. }
  93. }
  94. private static object _CoerceGlassFrameThickness(Thickness thickness)
  95. {
  96. if (!Utility.IsThicknessNonNegative(thickness))
  97. {
  98. return WindowChrome.GlassFrameCompleteThickness;
  99. }
  100. return thickness;
  101. }
  102. public Thickness GlassFrameThickness
  103. {
  104. get
  105. {
  106. return (Thickness) base.GetValue(WindowChrome.GlassFrameThicknessProperty);
  107. }
  108. set
  109. {
  110. base.SetValue(WindowChrome.GlassFrameThicknessProperty, value);
  111. }
  112. }
  113. public CornerRadius CornerRadius
  114. {
  115. get
  116. {
  117. return (CornerRadius) base.GetValue(WindowChrome.CornerRadiusProperty);
  118. }
  119. set
  120. {
  121. base.SetValue(WindowChrome.CornerRadiusProperty, value);
  122. }
  123. }
  124. protected override Freezable CreateInstanceCore()
  125. {
  126. return new WindowChrome();
  127. }
  128. public WindowChrome()
  129. {
  130. foreach (WindowChrome._SystemParameterBoundProperty systemParameterBoundProperty in WindowChrome._BoundProperties)
  131. {
  132. BindingOperations.SetBinding(this, systemParameterBoundProperty.DependencyProperty, new Binding
  133. {
  134. Source = SystemParameters2.Current,
  135. Path = new PropertyPath(systemParameterBoundProperty.SystemParameterPropertyName, new object[0]),
  136. Mode = BindingMode.OneWay,
  137. UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged
  138. });
  139. }
  140. }
  141. private void _OnPropertyChangedThatRequiresRepaint()
  142. {
  143. EventHandler propertyChangedThatRequiresRepaint = this.PropertyChangedThatRequiresRepaint;
  144. if (propertyChangedThatRequiresRepaint != null)
  145. {
  146. propertyChangedThatRequiresRepaint(this, EventArgs.Empty);
  147. }
  148. }
  149. internal event EventHandler PropertyChangedThatRequiresRepaint;
  150. public static readonly DependencyProperty WindowChromeProperty = DependencyProperty.RegisterAttached("WindowChrome", typeof(WindowChrome), typeof(WindowChrome), new PropertyMetadata(null, new PropertyChangedCallback(WindowChrome._OnChromeChanged)));
  151. public static readonly DependencyProperty IsHitTestVisibleInChromeProperty = DependencyProperty.RegisterAttached("IsHitTestVisibleInChrome", typeof(bool), typeof(WindowChrome), new FrameworkPropertyMetadata(false, FrameworkPropertyMetadataOptions.Inherits));
  152. public static readonly DependencyProperty CaptionHeightProperty = DependencyProperty.Register("CaptionHeight", typeof(double), typeof(WindowChrome), new PropertyMetadata(0.0, delegate (DependencyObject d, DependencyPropertyChangedEventArgs e)
  153. {
  154. ((WindowChrome) d)._OnPropertyChangedThatRequiresRepaint();
  155. }), (object value) => (double) value >= 0.0);
  156. public static readonly DependencyProperty ResizeBorderThicknessProperty = DependencyProperty.Register("ResizeBorderThickness", typeof(Thickness), typeof(WindowChrome), new PropertyMetadata(default(Thickness)), (object value) => Utility.IsThicknessNonNegative((Thickness) value));
  157. public static readonly DependencyProperty GlassFrameThicknessProperty = DependencyProperty.Register("GlassFrameThickness", typeof(Thickness), typeof(WindowChrome), new PropertyMetadata(default(Thickness), delegate (DependencyObject d, DependencyPropertyChangedEventArgs e)
  158. {
  159. ((WindowChrome) d)._OnPropertyChangedThatRequiresRepaint();
  160. }, (DependencyObject d, object o) => WindowChrome._CoerceGlassFrameThickness((Thickness) o)));
  161. public static readonly DependencyProperty CornerRadiusProperty = DependencyProperty.Register("CornerRadius", typeof(CornerRadius), typeof(WindowChrome), new PropertyMetadata(default(CornerRadius), delegate (DependencyObject d, DependencyPropertyChangedEventArgs e)
  162. {
  163. ((WindowChrome) d)._OnPropertyChangedThatRequiresRepaint();
  164. }), (object value) => Utility.IsCornerRadiusValid((CornerRadius) value));
  165. private static readonly List<WindowChrome._SystemParameterBoundProperty> _BoundProperties = new List<WindowChrome._SystemParameterBoundProperty>
  166. {
  167. new WindowChrome._SystemParameterBoundProperty
  168. {
  169. DependencyProperty = WindowChrome.CornerRadiusProperty,
  170. SystemParameterPropertyName = "WindowCornerRadius"
  171. },
  172. new WindowChrome._SystemParameterBoundProperty
  173. {
  174. DependencyProperty = WindowChrome.CaptionHeightProperty,
  175. SystemParameterPropertyName = "WindowCaptionHeight"
  176. },
  177. new WindowChrome._SystemParameterBoundProperty
  178. {
  179. DependencyProperty = WindowChrome.ResizeBorderThicknessProperty,
  180. SystemParameterPropertyName = "WindowResizeBorderThickness"
  181. },
  182. new WindowChrome._SystemParameterBoundProperty
  183. {
  184. DependencyProperty = WindowChrome.GlassFrameThicknessProperty,
  185. SystemParameterPropertyName = "WindowNonClientFrameThickness"
  186. }
  187. };
  188. private struct _SystemParameterBoundProperty
  189. {
  190. public string SystemParameterPropertyName { get; set; }
  191. public DependencyProperty DependencyProperty { get; set; }
  192. }
  193. }