翼度科技»论坛 编程开发 .net 查看内容

WPF实现placeholder效果

10

主题

10

帖子

30

积分

新手上路

Rank: 1

积分
30
 
概述:WPF中通过`Style`实现TextBox水印文本,使用`WatermarkTextBox`类及`ControlTemplate`。这个示例通过`VisualStateManager`在文本框失去焦点且内容为空时显示水印文本。通过`Watermark`属性简化水印文本设置,提高可维护性。
在WPF中,通过Style实现TextBox中的水印文本(水印、提示、占位符文本)通常使用ControlTemplate和VisualStateManager。以下是一个详细的实例源代码:
  1. using System.Windows;
  2. using System.Windows.Controls;
  3. namespace WpfWatermarkExample
  4. {
  5. <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  6.                     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  7.                     xmlns:local="clr-namespace:WpfWatermarkExample">
  8.    
  9. </ResourceDictionary>public partial class MainWindow : Window
  10. <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  11.                     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  12.                     xmlns:local="clr-namespace:WpfWatermarkExample">
  13.    
  14. </ResourceDictionary>{
  15. <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  16.                     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  17.                     xmlns:local="clr-namespace:WpfWatermarkExample">
  18.    
  19. </ResourceDictionary><ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  20.                     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  21.                     xmlns:local="clr-namespace:WpfWatermarkExample">
  22.    
  23. </ResourceDictionary>public MainWindow()
  24. <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  25.                     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  26.                     xmlns:local="clr-namespace:WpfWatermarkExample">
  27.    
  28. </ResourceDictionary><ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  29.                     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  30.                     xmlns:local="clr-namespace:WpfWatermarkExample">
  31.    
  32. </ResourceDictionary>{
  33. <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  34.                     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  35.                     xmlns:local="clr-namespace:WpfWatermarkExample">
  36.    
  37. </ResourceDictionary><ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  38.                     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  39.                     xmlns:local="clr-namespace:WpfWatermarkExample">
  40.    
  41. </ResourceDictionary><ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  42.                     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  43.                     xmlns:local="clr-namespace:WpfWatermarkExample">
  44.    
  45. </ResourceDictionary>InitializeComponent();
  46. <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  47.                     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  48.                     xmlns:local="clr-namespace:WpfWatermarkExample">
  49.    
  50. </ResourceDictionary><ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  51.                     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  52.                     xmlns:local="clr-namespace:WpfWatermarkExample">
  53.    
  54. </ResourceDictionary>}
  55. <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  56.                     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  57.                     xmlns:local="clr-namespace:WpfWatermarkExample">
  58.    
  59. </ResourceDictionary>}
  60. <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  61.                     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  62.                     xmlns:local="clr-namespace:WpfWatermarkExample">
  63.    
  64. </ResourceDictionary>public class WatermarkTextBox : TextBox
  65. <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  66.                     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  67.                     xmlns:local="clr-namespace:WpfWatermarkExample">
  68.    
  69. </ResourceDictionary>{
  70. <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  71.                     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  72.                     xmlns:local="clr-namespace:WpfWatermarkExample">
  73.    
  74. </ResourceDictionary><ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  75.                     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  76.                     xmlns:local="clr-namespace:WpfWatermarkExample">
  77.    
  78. </ResourceDictionary>public static readonly DependencyProperty WatermarkProperty =
  79. <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  80.                     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  81.                     xmlns:local="clr-namespace:WpfWatermarkExample">
  82.    
  83. </ResourceDictionary><ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  84.                     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  85.                     xmlns:local="clr-namespace:WpfWatermarkExample">
  86.    
  87. </ResourceDictionary><ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  88.                     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  89.                     xmlns:local="clr-namespace:WpfWatermarkExample">
  90.    
  91. </ResourceDictionary>DependencyProperty.Register("Watermark", typeof(string), typeof(WatermarkTextBox));
  92. <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  93.                     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  94.                     xmlns:local="clr-namespace:WpfWatermarkExample">
  95.    
  96. </ResourceDictionary><ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  97.                     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  98.                     xmlns:local="clr-namespace:WpfWatermarkExample">
  99.    
  100. </ResourceDictionary>public string Watermark
  101. <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  102.                     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  103.                     xmlns:local="clr-namespace:WpfWatermarkExample">
  104.    
  105. </ResourceDictionary><ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  106.                     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  107.                     xmlns:local="clr-namespace:WpfWatermarkExample">
  108.    
  109. </ResourceDictionary>{
  110. <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  111.                     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  112.                     xmlns:local="clr-namespace:WpfWatermarkExample">
  113.    
  114. </ResourceDictionary><ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  115.                     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  116.                     xmlns:local="clr-namespace:WpfWatermarkExample">
  117.    
  118. </ResourceDictionary><ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  119.                     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  120.                     xmlns:local="clr-namespace:WpfWatermarkExample">
  121.    
  122. </ResourceDictionary>get { return (string)GetValue(WatermarkProperty); }
  123. <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  124.                     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  125.                     xmlns:local="clr-namespace:WpfWatermarkExample">
  126.    
  127. </ResourceDictionary><ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  128.                     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  129.                     xmlns:local="clr-namespace:WpfWatermarkExample">
  130.    
  131. </ResourceDictionary><ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  132.                     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  133.                     xmlns:local="clr-namespace:WpfWatermarkExample">
  134.    
  135. </ResourceDictionary>set { SetValue(WatermarkProperty, value); }
  136. <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  137.                     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  138.                     xmlns:local="clr-namespace:WpfWatermarkExample">
  139.    
  140. </ResourceDictionary><ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  141.                     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  142.                     xmlns:local="clr-namespace:WpfWatermarkExample">
  143.    
  144. </ResourceDictionary>}
  145. <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  146.                     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  147.                     xmlns:local="clr-namespace:WpfWatermarkExample">
  148.    
  149. </ResourceDictionary><ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  150.                     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  151.                     xmlns:local="clr-namespace:WpfWatermarkExample">
  152.    
  153. </ResourceDictionary>static WatermarkTextBox()
  154. <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  155.                     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  156.                     xmlns:local="clr-namespace:WpfWatermarkExample">
  157.    
  158. </ResourceDictionary><ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  159.                     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  160.                     xmlns:local="clr-namespace:WpfWatermarkExample">
  161.    
  162. </ResourceDictionary>{
  163. <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  164.                     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  165.                     xmlns:local="clr-namespace:WpfWatermarkExample">
  166.    
  167. </ResourceDictionary><ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  168.                     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  169.                     xmlns:local="clr-namespace:WpfWatermarkExample">
  170.    
  171. </ResourceDictionary><ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  172.                     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  173.                     xmlns:local="clr-namespace:WpfWatermarkExample">
  174.    
  175. </ResourceDictionary>DefaultStyleKeyProperty.OverrideMetadata(typeof(WatermarkTextBox), new FrameworkPropertyMetadata(typeof(WatermarkTextBox)));
  176. <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  177.                     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  178.                     xmlns:local="clr-namespace:WpfWatermarkExample">
  179.    
  180. </ResourceDictionary><ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  181.                     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  182.                     xmlns:local="clr-namespace:WpfWatermarkExample">
  183.    
  184. </ResourceDictionary>}
  185. <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  186.                     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  187.                     xmlns:local="clr-namespace:WpfWatermarkExample">
  188.    
  189. </ResourceDictionary>}
  190. }
复制代码
XAML文件:
  1. <Window x:
  2. <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3.                     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  4.                     xmlns:local="clr-namespace:WpfWatermarkExample">
  5.    
  6. </ResourceDictionary><ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  7.                     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  8.                     xmlns:local="clr-namespace:WpfWatermarkExample">
  9.    
  10. </ResourceDictionary>xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  11. <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  12.                     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  13.                     xmlns:local="clr-namespace:WpfWatermarkExample">
  14.    
  15. </ResourceDictionary><ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  16.                     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  17.                     xmlns:local="clr-namespace:WpfWatermarkExample">
  18.    
  19. </ResourceDictionary>xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  20. <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  21.                     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  22.                     xmlns:local="clr-namespace:WpfWatermarkExample">
  23.    
  24. </ResourceDictionary><ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  25.                     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  26.                     xmlns:local="clr-namespace:WpfWatermarkExample">
  27.    
  28. </ResourceDictionary>xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
  29. <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  30.                     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  31.                     xmlns:local="clr-namespace:WpfWatermarkExample">
  32.    
  33. </ResourceDictionary><ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  34.                     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  35.                     xmlns:local="clr-namespace:WpfWatermarkExample">
  36.    
  37. </ResourceDictionary>xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
  38. <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  39.                     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  40.                     xmlns:local="clr-namespace:WpfWatermarkExample">
  41.    
  42. </ResourceDictionary><ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  43.                     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  44.                     xmlns:local="clr-namespace:WpfWatermarkExample">
  45.    
  46. </ResourceDictionary>mc:Ignorable="d"
  47. <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  48.                     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  49.                     xmlns:local="clr-namespace:WpfWatermarkExample">
  50.    
  51. </ResourceDictionary><ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  52.                     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  53.                     xmlns:local="clr-namespace:WpfWatermarkExample">
  54.    
  55. </ResourceDictionary>Title="MainWindow" Height="350" Width="525">
  56. <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  57.                     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  58.                     xmlns:local="clr-namespace:WpfWatermarkExample">
  59.    
  60. </ResourceDictionary><Grid>
  61. <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  62.                     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  63.                     xmlns:local="clr-namespace:WpfWatermarkExample">
  64.    
  65. </ResourceDictionary><ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  66.                     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  67.                     xmlns:local="clr-namespace:WpfWatermarkExample">
  68.    
  69. </ResourceDictionary><local:WatermarkTextBox Watermark="请输入内容" Width="200" Height="30"/>
  70. <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  71.                     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  72.                     xmlns:local="clr-namespace:WpfWatermarkExample">
  73.    
  74. </ResourceDictionary></Grid>
  75. </Window>
复制代码
Themes/Generic.xaml文件:
  1. <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  2.                     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  3.                     xmlns:local="clr-namespace:WpfWatermarkExample">
  4.    
  5. </ResourceDictionary>
复制代码
看效果:
 
这个例子中,自定义了WatermarkTextBox类,其中包含一个Watermark属性。在Themes/Generic.xaml中,定义了WatermarkTextBox的ControlTemplate,通过VisualStateManager在未获得焦点且文本为空时显示水印文本。在MainWindow.xaml中使用了WatermarkTextBox并设置了水印文本。
源代码获取:https://pan.baidu.com/s/1YCuKZhEOrs-C3nGqjNB-lA?pwd=6666 
 



来源:https://www.cnblogs.com/hanbing81868164/p/18103345
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具