123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117 |
- using System.Windows;
- using System.Windows.Controls;
- using System.Windows.Data;
- using System.Windows.Documents;
- using System.Windows.Media;
- namespace MECF.Framework.UI.Client.ClientBase.AttachedProperties
- {
- /// <summary>
- /// Adorner for the watermark
- /// </summary>
- internal class WatermarkAdorner : Adorner
- {
- #region Private Fields
- /// <summary>
- /// <see cref="ContentPresenter"/> that holds the watermark
- /// </summary>
- private readonly ContentPresenter _contentPresenter;
- #endregion
- #region Constructor
- /// <summary>
- /// Initializes a new instance of the <see cref="WatermarkAdorner"/> class
- /// </summary>
- /// <param name="adornedElement"><see cref="UIElement"/> to be adorned</param>
- /// <param name="watermark">The watermark</param>
- public WatermarkAdorner(UIElement adornedElement, object watermark) :
- base(adornedElement)
- {
- IsHitTestVisible = false;
- _contentPresenter = new ContentPresenter
- {
- Content = watermark,
- Opacity = 0.3,
- Margin = new Thickness(Control.Margin.Left + Control.Padding.Left,
- Control.Margin.Top + Control.Padding.Top, 0, 0)
- };
- if (Control is ItemsControl && !(Control is ComboBox))
- {
- _contentPresenter.VerticalAlignment = VerticalAlignment.Center;
- _contentPresenter.HorizontalAlignment = HorizontalAlignment.Center;
- }
- // Hide the control adorner when the adorned element is hidden
- var binding = new Binding("IsVisible")
- {
- Source = adornedElement,
- Converter = new BooleanToVisibilityConverter()
- };
- SetBinding(VisibilityProperty, binding);
- }
- #endregion
- #region Protected Properties
- /// <summary>
- /// Gets the number of children for the <see cref="ContainerVisual"/>.
- /// </summary>
- protected override int VisualChildrenCount => 1;
- #endregion
- #region Private Properties
- /// <summary>
- /// Gets the control that is being adorned
- /// </summary>
- private Control Control => (Control)AdornedElement;
- #endregion
- #region Protected Overrides
- /// <summary>
- /// Returns a specified child <see cref="Visual"/> for the parent <see cref="ContainerVisual"/>.
- /// </summary>
- /// <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>
- /// <returns>The child <see cref="Visual"/>.</returns>
- protected override Visual GetVisualChild(int index)
- {
- return _contentPresenter;
- }
- /// <summary>
- /// Implements any custom measuring behavior for the adorner.
- /// </summary>
- /// <param name="constraint">A size to constrain the adorner to.</param>
- /// <returns>A <see cref="Size"/> object representing the amount of layout space needed by the adorner.</returns>
- protected override Size MeasureOverride(Size constraint)
- {
- // Here's the secret to getting the adorner to cover the whole control
- _contentPresenter.Measure(Control.RenderSize);
- return Control.RenderSize;
- }
- /// <summary>
- /// When overridden in a derived class, positions child elements and determines a size for a <see cref="FrameworkElement"/> derived class.
- /// </summary>
- /// <param name="finalSize">The final area within the parent that this element should use to arrange itself and its children.</param>
- /// <returns>The actual size used.</returns>
- protected override Size ArrangeOverride(Size finalSize)
- {
- _contentPresenter.Arrange(new Rect(finalSize));
- return finalSize;
- }
- #endregion
- }
- }
|