WatermarkAdorner.cs 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. using System.Windows;
  2. using System.Windows.Controls;
  3. using System.Windows.Data;
  4. using System.Windows.Documents;
  5. using System.Windows.Media;
  6. namespace MECF.Framework.UI.Client.ClientBase.AttachedProperties
  7. {
  8. /// <summary>
  9. /// Adorner for the watermark
  10. /// </summary>
  11. internal class WatermarkAdorner : Adorner
  12. {
  13. #region Private Fields
  14. /// <summary>
  15. /// <see cref="ContentPresenter"/> that holds the watermark
  16. /// </summary>
  17. private readonly ContentPresenter _contentPresenter;
  18. #endregion
  19. #region Constructor
  20. /// <summary>
  21. /// Initializes a new instance of the <see cref="WatermarkAdorner"/> class
  22. /// </summary>
  23. /// <param name="adornedElement"><see cref="UIElement"/> to be adorned</param>
  24. /// <param name="watermark">The watermark</param>
  25. public WatermarkAdorner(UIElement adornedElement, object watermark) :
  26. base(adornedElement)
  27. {
  28. IsHitTestVisible = false;
  29. _contentPresenter = new ContentPresenter
  30. {
  31. Content = watermark,
  32. Opacity = 0.3,
  33. Margin = new Thickness(Control.Margin.Left + Control.Padding.Left,
  34. Control.Margin.Top + Control.Padding.Top, 0, 0)
  35. };
  36. if (Control is ItemsControl && !(Control is ComboBox))
  37. {
  38. _contentPresenter.VerticalAlignment = VerticalAlignment.Center;
  39. _contentPresenter.HorizontalAlignment = HorizontalAlignment.Center;
  40. }
  41. // Hide the control adorner when the adorned element is hidden
  42. var binding = new Binding("IsVisible")
  43. {
  44. Source = adornedElement,
  45. Converter = new BooleanToVisibilityConverter()
  46. };
  47. SetBinding(VisibilityProperty, binding);
  48. }
  49. #endregion
  50. #region Protected Properties
  51. /// <summary>
  52. /// Gets the number of children for the <see cref="ContainerVisual"/>.
  53. /// </summary>
  54. protected override int VisualChildrenCount => 1;
  55. #endregion
  56. #region Private Properties
  57. /// <summary>
  58. /// Gets the control that is being adorned
  59. /// </summary>
  60. private Control Control => (Control)AdornedElement;
  61. #endregion
  62. #region Protected Overrides
  63. /// <summary>
  64. /// Returns a specified child <see cref="Visual"/> for the parent <see cref="ContainerVisual"/>.
  65. /// </summary>
  66. /// <param name="index">A 32-bit signed integer that represents the index value of the child <see cref="Visual"/>. The value of index must be between 0 and <see cref="VisualChildrenCount"/> - 1.</param>
  67. /// <returns>The child <see cref="Visual"/>.</returns>
  68. protected override Visual GetVisualChild(int index)
  69. {
  70. return _contentPresenter;
  71. }
  72. /// <summary>
  73. /// Implements any custom measuring behavior for the adorner.
  74. /// </summary>
  75. /// <param name="constraint">A size to constrain the adorner to.</param>
  76. /// <returns>A <see cref="Size"/> object representing the amount of layout space needed by the adorner.</returns>
  77. protected override Size MeasureOverride(Size constraint)
  78. {
  79. // Here's the secret to getting the adorner to cover the whole control
  80. _contentPresenter.Measure(Control.RenderSize);
  81. return Control.RenderSize;
  82. }
  83. /// <summary>
  84. /// When overridden in a derived class, positions child elements and determines a size for a <see cref="FrameworkElement"/> derived class.
  85. /// </summary>
  86. /// <param name="finalSize">The final area within the parent that this element should use to arrange itself and its children.</param>
  87. /// <returns>The actual size used.</returns>
  88. protected override Size ArrangeOverride(Size finalSize)
  89. {
  90. _contentPresenter.Arrange(new Rect(finalSize));
  91. return finalSize;
  92. }
  93. #endregion
  94. }
  95. }