Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 带有水印文本框的附加属性_C#_Wpf_Textbox - Fatal编程技术网

C# 带有水印文本框的附加属性

C# 带有水印文本框的附加属性,c#,wpf,textbox,C#,Wpf,Textbox,我想要一个带有水印文本的文本框。我使用的是解决方案,它可以很好地工作 因为我在控件中有几个文本框,所以我想让它有点动态。所以我(第一次)使用了一个附加属性,但我无法使它工作。没有编译错误,但在XAML中无法解析Tag语句。。。Content={Binding Path=view:SomeClass.Tag,RelativeSource=… 这里怎么了 我是用XAML做的 <StackPanel Grid.Row="1" TextBlock.FontSize="12">

我想要一个带有水印文本的文本框。我使用的是解决方案,它可以很好地工作

因为我在控件中有几个文本框,所以我想让它有点动态。所以我(第一次)使用了一个附加属性,但我无法使它工作。没有编译错误,但在XAML中无法解析Tag语句
。。。Content={Binding Path=view:SomeClass.Tag,RelativeSource=…

这里怎么了

我是用XAML做的

    <StackPanel Grid.Row="1" TextBlock.FontSize="12">
        <TextBox Style="{DynamicResource TextBoxWaterMark}" view:SomeClass.Tag="Search" />
    </StackPanel>

对于附加属性,需要在绑定路径中使用括号:

<Label Content="{Binding Path=(view:SomeClass.Tag)}" />


这是与如何绑定到其他类型(如索引器和集合视图)的说明一起编写的。

您可以创建这样的类型附加属性。此处查看如何绑定

大多数人都在寻找watermask文本框,combobo项目控件等等。让我们一次涵盖所有这些

创建AttachedProperty,如

     using System;
       using System.Collections.Generic;
       using System.ComponentModel;
       using System.Windows;
       using System.Windows.Controls;
       using System.Windows.Controls.Primitives;
       using System.Windows.Documents;

       /// <summary>
       /// Class that provides the Watermark attached property
       /// </summary>
       public static class WatermarkService
       {
          /// <summary>
          /// Watermark Attached Dependency Property
          /// </summary>
          public static readonly DependencyProperty WatermarkProperty = DependencyProperty.RegisterAttached(
             "Watermark",
             typeof(object),
             typeof(WatermarkService),
             new FrameworkPropertyMetadata((object)null, new PropertyChangedCallback(OnWatermarkChanged)));

          #region Private Fields

          /// <summary>
          /// Dictionary of ItemsControls
          /// </summary>
          private static readonly Dictionary<object, ItemsControl> itemsControls = new Dictionary<object, ItemsControl>();

          #endregion

          /// <summary>
          /// Gets the Watermark property.  This dependency property indicates the watermark for the control.
          /// </summary>
          /// <param name="d"><see cref="DependencyObject"/> to get the property from</param>
          /// <returns>The value of the Watermark property</returns>
          public static object GetWatermark(DependencyObject d)
          {
             return (object)d.GetValue(WatermarkProperty);
          }

          /// <summary>
          /// Sets the Watermark property.  This dependency property indicates the watermark for the control.
          /// </summary>
          /// <param name="d"><see cref="DependencyObject"/> to set the property on</param>
          /// <param name="value">value of the property</param>
          public static void SetWatermark(DependencyObject d, object value)
          {
             d.SetValue(WatermarkProperty, value);
          }

          /// <summary>
          /// Handles changes to the Watermark property.
          /// </summary>
          /// <param name="d"><see cref="DependencyObject"/> that fired the event</param>
          /// <param name="e">A <see cref="DependencyPropertyChangedEventArgs"/> that contains the event data.</param>
          private static void OnWatermarkChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
          {
             Control control = (Control)d;
             control.Loaded += Control_Loaded;

             if (d is ComboBox || d is TextBox)
             {
                control.GotKeyboardFocus += Control_GotKeyboardFocus;
                control.LostKeyboardFocus += Control_Loaded;
             }

             if (d is ItemsControl && !(d is ComboBox))
             {
                ItemsControl i = (ItemsControl)d;

                // for Items property  
                i.ItemContainerGenerator.ItemsChanged += ItemsChanged;
                itemsControls.Add(i.ItemContainerGenerator, i);

                // for ItemsSource property  
                DependencyPropertyDescriptor prop = DependencyPropertyDescriptor.FromProperty(ItemsControl.ItemsSourceProperty, i.GetType());
                prop.AddValueChanged(i, ItemsSourceChanged);
             }
          }

          #region Event Handlers

          /// <summary>
          /// Handle the GotFocus event on the control
          /// </summary>
          /// <param name="sender">The source of the event.</param>
          /// <param name="e">A <see cref="RoutedEventArgs"/> that contains the event data.</param>
          private static void Control_GotKeyboardFocus(object sender, RoutedEventArgs e)
          {
             Control c = (Control)sender;
             if (ShouldShowWatermark(c))
             {
                RemoveWatermark(c);
             }
          }

          /// <summary>
          /// Handle the Loaded and LostFocus event on the control
          /// </summary>
          /// <param name="sender">The source of the event.</param>
          /// <param name="e">A <see cref="RoutedEventArgs"/> that contains the event data.</param>
          private static void Control_Loaded(object sender, RoutedEventArgs e)
          {
             Control control = (Control)sender;
             if (ShouldShowWatermark(control))
             {
                ShowWatermark(control);
             }
          }

          /// <summary>
          /// Event handler for the items source changed event
          /// </summary>
          /// <param name="sender">The source of the event.</param>
          /// <param name="e">A <see cref="EventArgs"/> that contains the event data.</param>
          private static void ItemsSourceChanged(object sender, EventArgs e)
          {
             ItemsControl c = (ItemsControl)sender;
             if (c.ItemsSource != null)
             {
                if (ShouldShowWatermark(c))
                {
                   ShowWatermark(c);
                }
                else
                {
                   RemoveWatermark(c);
                }
             }
             else
             {
                ShowWatermark(c);
             }
          }

          /// <summary>
          /// Event handler for the items changed event
          /// </summary>
          /// <param name="sender">The source of the event.</param>
          /// <param name="e">A <see cref="ItemsChangedEventArgs"/> that contains the event data.</param>
          private static void ItemsChanged(object sender, ItemsChangedEventArgs e)
          {
             ItemsControl control;
             if (itemsControls.TryGetValue(sender, out control))
             {
                if (ShouldShowWatermark(control))
                {
                   ShowWatermark(control);
                }
                else
                {
                   RemoveWatermark(control);
                }
             }
          }

          #endregion

          #region Helper Methods

          /// <summary>
          /// Remove the watermark from the specified element
          /// </summary>
          /// <param name="control">Element to remove the watermark from</param>
          private static void RemoveWatermark(UIElement control)
          {
             AdornerLayer layer = AdornerLayer.GetAdornerLayer(control);

             // layer could be null if control is no longer in the visual tree
             if (layer != null)
             {
                Adorner[] adorners = layer.GetAdorners(control);
                if (adorners == null)
                {
                   return;
                }

                foreach (Adorner adorner in adorners)
                {
                   if (adorner is WatermarkAdorner)
                   {
                      adorner.Visibility = Visibility.Hidden;
                      layer.Remove(adorner);
                   }
                }
             }
          }

          /// <summary>
          /// Show the watermark on the specified control
          /// </summary>
          /// <param name="control">Control to show the watermark on</param>
          private static void ShowWatermark(Control control)
          {
             AdornerLayer layer = AdornerLayer.GetAdornerLayer(control);

             // layer could be null if control is no longer in the visual tree
             if (layer != null)
             {
                layer.Add(new WatermarkAdorner(control, GetWatermark(control)));
             }
          }

          /// <summary>
          /// Indicates whether or not the watermark should be shown on the specified control
          /// </summary>
          /// <param name="c"><see cref="Control"/> to test</param>
          /// <returns>true if the watermark should be shown; false otherwise</returns>
          private static bool ShouldShowWatermark(Control c)
          {
             if (c is ComboBox)
             {
                return (c as ComboBox).Text == string.Empty;
             }
             else if (c is TextBoxBase)
             {
                return (c as TextBox).Text == string.Empty;
             }
             else if (c is ItemsControl)
             {
                return (c as ItemsControl).Items.Count == 0;
             }
             else
             {
                return false;
             }
          }

          #endregion
       }

using System.Windows;
   using System.Windows.Controls;
   using System.Windows.Data;
   using System.Windows.Documents;
   using System.Windows.Media;

   /// <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)
      {
         this.IsHitTestVisible = false;

         this.contentPresenter = new ContentPresenter();
         this.contentPresenter.Content = watermark;
         this.contentPresenter.Opacity = 0.5;
         this.contentPresenter.Margin = new Thickness(Control.Margin.Left + Control.Padding.Left, Control.Margin.Top + Control.Padding.Top, 0, 0);

         if (this.Control is ItemsControl && !(this.Control is ComboBox))
         {
            this.contentPresenter.VerticalAlignment = VerticalAlignment.Center;
            this.contentPresenter.HorizontalAlignment = HorizontalAlignment.Center;
         }

         // Hide the control adorner when the adorned element is hidden
         Binding binding = new Binding("IsVisible");
         binding.Source = adornedElement;
         binding.Converter = new BooleanToVisibilityConverter();
         this.SetBinding(VisibilityProperty, binding);
      }

      #endregion

      #region Protected Properties

      /// <summary>
      /// Gets the number of children for the <see cref="ContainerVisual"/>.
      /// </summary>
      protected override int VisualChildrenCount
      {
         get { return 1; }
      }

      #endregion

      #region Private Properties

      /// <summary>
      /// Gets the control that is being adorned
      /// </summary>
      private Control Control
      {
         get { return (Control)this.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 this.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
         this.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)
      {
         this.contentPresenter.Arrange(new Rect(finalSize));
         return finalSize;
      }

      #endregion
   }
使用系统;
使用System.Collections.Generic;
使用系统组件模型;
使用System.Windows;
使用System.Windows.Controls;
使用System.Windows.Controls.Primitives;
使用System.Windows.Documents;
/// 
///类,该类提供水印附加属性
/// 
公共静态类水印服务
{
/// 
///水印附加依赖属性
/// 
公共静态只读DependencyProperty WatermarkProperty=DependencyProperty.RegisterAttached(
“水印”,
类型(对象),
类型(水印服务),
新的FrameworkPropertyMetadata((对象)null,新的PropertyChangedCallback(OnWatermarkChanged));
#区域专用字段
/// 
///项目控制词典
/// 
私有静态只读字典项控件=新字典();
#端区
/// 
///获取水印属性。此依赖项属性指示控件的水印。
/// 
///取得财产
///水印属性的值
公共静态对象GetWatermark(DependencyObject d)
{
返回(对象)d.GetValue(WatermarkProperty);
}
/// 
///设置水印属性。此依赖项属性指示控件的水印。
/// 
///将属性设置为
///财产价值
公共静态无效设置水印(DependencyObject d,对象值)
{
d、 SetValue(水印属性、值);
}
/// 
///处理对水印属性的更改。
/// 
///这引发了事件
///包含事件数据的。
WatermarkChanged上的私有静态无效(DependencyObject d、DependencyPropertyChangedEventArgs e)
{
对照=(对照)d;
control.Loaded+=控件\u Loaded;
如果(d是组合框| | d是文本框)
{
control.GotKeyboardFocus+=控件\u GotKeyboardFocus;
control.LostKeyboardFocus+=已加载控件;
}
如果(d是ItemsControl&!(d是组合框))
{
ItemsControl i=(ItemsControl)d;
//对于项目属性
i、 ItemContainerGenerator.ItemsChanged+=ItemsChanged;
ItemsControl.Add(i.ItemContainerGenerator,i);
//对于ItemsSource属性
DependencyPropertyDescriptor prop=DependencyPropertyDescriptor.FromProperty(ItemsControl.ItemsSourceProperty,i.GetType());
项目AddValueChanged(i,项目来源变更);
}
}
#区域事件处理程序
/// 
///处理控件上的GotFocus事件
/// 
///事件的来源。
///包含事件数据的。
私有静态无效控制\u GotKeyboardFocus(对象发送器、路由目标)
{
控制c=(控制)发送方;
如果(应显示水印(c))
{
去除水印(c);
}
}
/// 
///处理控件上的Loaded和LostFocus事件
/// 
///事件的来源。
///包含事件数据的。
已加载私有静态无效控件(对象发送器、路由目标)
{
控制=(控制)发送方;
如果(应显示水印(控制))
{
显示水印(对照);
}
}
/// 
///items源已更改事件的事件处理程序
/// 
///事件的来源。
///包含事件数据的。
私有静态无效项SourceChanged(对象发送方,事件参数e)
{
ItemsControl c=(ItemsControl)发送方;
如果(c.ItemsSource!=null)
{
如果(应显示水印(c))
{
显示水印(c);
}
其他的
{
去除水印(c);
}
}
其他的
{
显示水印(c);
}
}
/// 
///items changed事件的事件处理程序
/// 
///事件的来源。
///包含事件数据的。
私有静态void ItemsChanged(对象发送方,itemschangedventargs e)
{
项目控制;
if(itemsControls.TryGetValue(发送方,失控))
{
如果(应显示水印(控制))
{
显示水印(对照);
}
其他的
{
<Label Content="{Binding Path=(view:SomeClass.Tag)}" />
     using System;
       using System.Collections.Generic;
       using System.ComponentModel;
       using System.Windows;
       using System.Windows.Controls;
       using System.Windows.Controls.Primitives;
       using System.Windows.Documents;

       /// <summary>
       /// Class that provides the Watermark attached property
       /// </summary>
       public static class WatermarkService
       {
          /// <summary>
          /// Watermark Attached Dependency Property
          /// </summary>
          public static readonly DependencyProperty WatermarkProperty = DependencyProperty.RegisterAttached(
             "Watermark",
             typeof(object),
             typeof(WatermarkService),
             new FrameworkPropertyMetadata((object)null, new PropertyChangedCallback(OnWatermarkChanged)));

          #region Private Fields

          /// <summary>
          /// Dictionary of ItemsControls
          /// </summary>
          private static readonly Dictionary<object, ItemsControl> itemsControls = new Dictionary<object, ItemsControl>();

          #endregion

          /// <summary>
          /// Gets the Watermark property.  This dependency property indicates the watermark for the control.
          /// </summary>
          /// <param name="d"><see cref="DependencyObject"/> to get the property from</param>
          /// <returns>The value of the Watermark property</returns>
          public static object GetWatermark(DependencyObject d)
          {
             return (object)d.GetValue(WatermarkProperty);
          }

          /// <summary>
          /// Sets the Watermark property.  This dependency property indicates the watermark for the control.
          /// </summary>
          /// <param name="d"><see cref="DependencyObject"/> to set the property on</param>
          /// <param name="value">value of the property</param>
          public static void SetWatermark(DependencyObject d, object value)
          {
             d.SetValue(WatermarkProperty, value);
          }

          /// <summary>
          /// Handles changes to the Watermark property.
          /// </summary>
          /// <param name="d"><see cref="DependencyObject"/> that fired the event</param>
          /// <param name="e">A <see cref="DependencyPropertyChangedEventArgs"/> that contains the event data.</param>
          private static void OnWatermarkChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
          {
             Control control = (Control)d;
             control.Loaded += Control_Loaded;

             if (d is ComboBox || d is TextBox)
             {
                control.GotKeyboardFocus += Control_GotKeyboardFocus;
                control.LostKeyboardFocus += Control_Loaded;
             }

             if (d is ItemsControl && !(d is ComboBox))
             {
                ItemsControl i = (ItemsControl)d;

                // for Items property  
                i.ItemContainerGenerator.ItemsChanged += ItemsChanged;
                itemsControls.Add(i.ItemContainerGenerator, i);

                // for ItemsSource property  
                DependencyPropertyDescriptor prop = DependencyPropertyDescriptor.FromProperty(ItemsControl.ItemsSourceProperty, i.GetType());
                prop.AddValueChanged(i, ItemsSourceChanged);
             }
          }

          #region Event Handlers

          /// <summary>
          /// Handle the GotFocus event on the control
          /// </summary>
          /// <param name="sender">The source of the event.</param>
          /// <param name="e">A <see cref="RoutedEventArgs"/> that contains the event data.</param>
          private static void Control_GotKeyboardFocus(object sender, RoutedEventArgs e)
          {
             Control c = (Control)sender;
             if (ShouldShowWatermark(c))
             {
                RemoveWatermark(c);
             }
          }

          /// <summary>
          /// Handle the Loaded and LostFocus event on the control
          /// </summary>
          /// <param name="sender">The source of the event.</param>
          /// <param name="e">A <see cref="RoutedEventArgs"/> that contains the event data.</param>
          private static void Control_Loaded(object sender, RoutedEventArgs e)
          {
             Control control = (Control)sender;
             if (ShouldShowWatermark(control))
             {
                ShowWatermark(control);
             }
          }

          /// <summary>
          /// Event handler for the items source changed event
          /// </summary>
          /// <param name="sender">The source of the event.</param>
          /// <param name="e">A <see cref="EventArgs"/> that contains the event data.</param>
          private static void ItemsSourceChanged(object sender, EventArgs e)
          {
             ItemsControl c = (ItemsControl)sender;
             if (c.ItemsSource != null)
             {
                if (ShouldShowWatermark(c))
                {
                   ShowWatermark(c);
                }
                else
                {
                   RemoveWatermark(c);
                }
             }
             else
             {
                ShowWatermark(c);
             }
          }

          /// <summary>
          /// Event handler for the items changed event
          /// </summary>
          /// <param name="sender">The source of the event.</param>
          /// <param name="e">A <see cref="ItemsChangedEventArgs"/> that contains the event data.</param>
          private static void ItemsChanged(object sender, ItemsChangedEventArgs e)
          {
             ItemsControl control;
             if (itemsControls.TryGetValue(sender, out control))
             {
                if (ShouldShowWatermark(control))
                {
                   ShowWatermark(control);
                }
                else
                {
                   RemoveWatermark(control);
                }
             }
          }

          #endregion

          #region Helper Methods

          /// <summary>
          /// Remove the watermark from the specified element
          /// </summary>
          /// <param name="control">Element to remove the watermark from</param>
          private static void RemoveWatermark(UIElement control)
          {
             AdornerLayer layer = AdornerLayer.GetAdornerLayer(control);

             // layer could be null if control is no longer in the visual tree
             if (layer != null)
             {
                Adorner[] adorners = layer.GetAdorners(control);
                if (adorners == null)
                {
                   return;
                }

                foreach (Adorner adorner in adorners)
                {
                   if (adorner is WatermarkAdorner)
                   {
                      adorner.Visibility = Visibility.Hidden;
                      layer.Remove(adorner);
                   }
                }
             }
          }

          /// <summary>
          /// Show the watermark on the specified control
          /// </summary>
          /// <param name="control">Control to show the watermark on</param>
          private static void ShowWatermark(Control control)
          {
             AdornerLayer layer = AdornerLayer.GetAdornerLayer(control);

             // layer could be null if control is no longer in the visual tree
             if (layer != null)
             {
                layer.Add(new WatermarkAdorner(control, GetWatermark(control)));
             }
          }

          /// <summary>
          /// Indicates whether or not the watermark should be shown on the specified control
          /// </summary>
          /// <param name="c"><see cref="Control"/> to test</param>
          /// <returns>true if the watermark should be shown; false otherwise</returns>
          private static bool ShouldShowWatermark(Control c)
          {
             if (c is ComboBox)
             {
                return (c as ComboBox).Text == string.Empty;
             }
             else if (c is TextBoxBase)
             {
                return (c as TextBox).Text == string.Empty;
             }
             else if (c is ItemsControl)
             {
                return (c as ItemsControl).Items.Count == 0;
             }
             else
             {
                return false;
             }
          }

          #endregion
       }

using System.Windows;
   using System.Windows.Controls;
   using System.Windows.Data;
   using System.Windows.Documents;
   using System.Windows.Media;

   /// <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)
      {
         this.IsHitTestVisible = false;

         this.contentPresenter = new ContentPresenter();
         this.contentPresenter.Content = watermark;
         this.contentPresenter.Opacity = 0.5;
         this.contentPresenter.Margin = new Thickness(Control.Margin.Left + Control.Padding.Left, Control.Margin.Top + Control.Padding.Top, 0, 0);

         if (this.Control is ItemsControl && !(this.Control is ComboBox))
         {
            this.contentPresenter.VerticalAlignment = VerticalAlignment.Center;
            this.contentPresenter.HorizontalAlignment = HorizontalAlignment.Center;
         }

         // Hide the control adorner when the adorned element is hidden
         Binding binding = new Binding("IsVisible");
         binding.Source = adornedElement;
         binding.Converter = new BooleanToVisibilityConverter();
         this.SetBinding(VisibilityProperty, binding);
      }

      #endregion

      #region Protected Properties

      /// <summary>
      /// Gets the number of children for the <see cref="ContainerVisual"/>.
      /// </summary>
      protected override int VisualChildrenCount
      {
         get { return 1; }
      }

      #endregion

      #region Private Properties

      /// <summary>
      /// Gets the control that is being adorned
      /// </summary>
      private Control Control
      {
         get { return (Control)this.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 this.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
         this.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)
      {
         this.contentPresenter.Arrange(new Rect(finalSize));
         return finalSize;
      }

      #endregion
   }
<Window x:Class="WpfApplication1.Window1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
        xmlns:local="clr-namespace:WpfApplication1"
        Height="403" 
        Width="346" 
        Title="Window1">   
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition />
            <RowDefinition />
        </Grid.RowDefinitions>
        <AdornerDecorator Grid.Row="0">
            <TextBox  VerticalAlignment="Center" >
                <local:WatermarkService.Watermark>
                    <TextBlock VerticalAlignment="Center" HorizontalAlignment="Center" FontSize="12">TextBox Water Mask </TextBlock>
                </local:WatermarkService.Watermark>
            </TextBox>
        </AdornerDecorator>
        <AdornerDecorator Grid.Row="1">
            <ComboBox  ItemsSource="{Binding Items}">
                <local:WatermarkService.Watermark>
                   <TextBlock VerticalAlignment="Center" HorizontalAlignment="Center" FontSize="12">Combo Box WaterMask</TextBlock>
                </local:WatermarkService.Watermark>
            </ComboBox>
        </AdornerDecorator>     
    </Grid>
</Window>