TextWatermark.cs 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using System.Windows;
  7. using System.Windows.Controls;
  8. using System.Windows.Media;
  9. namespace FWindSoft.Wpf.Controls
  10. {
  11. public class TextWatermark
  12. {
  13. public static readonly DependencyProperty ShowInfoProperty = DependencyProperty.RegisterAttached("ShowInfo",
  14. typeof(string), typeof(TextWatermark), new PropertyMetadata(string.Empty, OnShowChanged));
  15. public static readonly DependencyProperty UseWatermarkProperty = DependencyProperty.RegisterAttached("UseWatermark",
  16. typeof(bool), typeof(TextWatermark), new PropertyMetadata(false, OnShowChanged));
  17. private static readonly DependencyProperty RefTriggerProperty = DependencyProperty.RegisterAttached("RefTrigger",
  18. typeof(MultiTrigger), typeof(TextWatermark));
  19. [AttachedPropertyBrowsableForType(typeof(TextBox))]
  20. public static string GetShowInfo(DependencyObject obj)
  21. {
  22. return (string)obj.GetValue(ShowInfoProperty);
  23. }
  24. [AttachedPropertyBrowsableForType(typeof(TextBox))]
  25. public static void SetShowInfo(DependencyObject obj, string value)
  26. {
  27. obj.SetValue(ShowInfoProperty, value);
  28. }
  29. [AttachedPropertyBrowsableForType(typeof(TextBox))]
  30. public static bool GetUseWatermark(DependencyObject obj)
  31. {
  32. return (bool)obj.GetValue(UseWatermarkProperty);
  33. }
  34. [AttachedPropertyBrowsableForType(typeof(TextBox))]
  35. public static void SetUseWatermark(DependencyObject obj, bool value)
  36. {
  37. obj.SetValue(UseWatermarkProperty, value);
  38. }
  39. /*
  40. 可以使用蒙版的形式
  41. */
  42. public static void OnShowChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
  43. {
  44. TextBox textBox = d as TextBox;
  45. if (textBox == null)
  46. return;
  47. //创建触发器
  48. Style style = null;
  49. try
  50. {
  51. style = new Style() {TargetType=typeof(TextBox)};
  52. if (textBox.Style != null)
  53. {
  54. #region 复制style
  55. style.BasedOn = textBox.Style;
  56. #endregion
  57. }
  58. //else
  59. //{
  60. // style = new Style();
  61. //}
  62. var oldTrigger = (MultiTrigger)textBox.GetValue(TextWatermark.RefTriggerProperty);
  63. if (oldTrigger != null)
  64. {
  65. style.Triggers.Remove(oldTrigger);
  66. }
  67. if (!GetUseWatermark(textBox))
  68. {
  69. return;
  70. }
  71. MultiTrigger multiTrigger = new MultiTrigger();
  72. //暂时不需要交点控制
  73. //multiTrigger.Conditions.Add(new Condition(TextBox.IsFocusedProperty, false));
  74. multiTrigger.Conditions.Add(new Condition(TextBox.TextProperty, string.Empty));
  75. Setter setter = new Setter();
  76. setter.Property = TextBox.BackgroundProperty;
  77. setter.Value = new VisualBrush()
  78. {
  79. AlignmentX = AlignmentX.Left,
  80. AlignmentY = AlignmentY.Top,
  81. Stretch = Stretch.None,
  82. Visual = new TextBlock()
  83. {
  84. Text = GetShowInfo(textBox),
  85. Background = (Brush)textBox.GetValue(TextBox.BackgroundProperty), //Brushes.Transparent,
  86. Foreground = Brushes.Gray,
  87. FontSize = textBox.FontSize,
  88. }
  89. };
  90. multiTrigger.Setters.Add(setter);
  91. textBox.SetValue(TextWatermark.RefTriggerProperty, multiTrigger);
  92. style.Triggers.Add(multiTrigger);
  93. textBox.Style = style;
  94. }
  95. catch (Exception ex)
  96. {
  97. throw;
  98. }
  99. }
  100. }
  101. }