WPF 通过TextBox实现一个带水印和图标的输入框

代码如下:
前端定义一个TextBox:

<!-- TextBox的Style绑定到下面的静态资源,CaretBrush表示光标的颜色 -->
<TextBox Name="textBox" FontSize="12" Foreground="White" Margin="5" Width="200" Height="30" Style="{StaticResource QueryTextBoxStyle}" CaretBrush="White">

在资源文件中加入以下内容:

<Style TargetType="TextBox" x:Key="QueryTextBoxStyle"><!-- x:Key="QueryTextBoxStyle"此属性是必须的,Style通过Key来绑定 -->
	<Setter Property ="Template">
		<Setter.Value>
			<ControlTemplate TargetType="TextBox">
				<!-- 定义一个Border实现TextBox的边框样式的改变 -->
				<Border x:Name="border" BorderBrush="{TemplateBinding BorderBrush}"
                                SnapsToDevicePixels="True" BorderThickness="1" CornerRadius="5">
                    <!-- 定义一个Grid把TextBox分为两列 -->
					<Grid>
						<Grid.ColumnDefinitions>
							<ColumnDefinition/>
                            <ColumnDefinition Width="auto"/>
                    	</Grid.ColumnDefinitions>
                    	<!-- 在第一列定义一个TextBlock,用来实现水印 -->
                        <TextBlock Name="markText" Text="请输入查询内容" Foreground="DarkGray" Margin="5" FontSize="12" HorizontalAlignment="Left" VerticalAlignment="Center" Visibility="Collapsed"/>
                        <!-- 第二列定义一个TextBlock,用来放图标 -->
                        <TextBlock Grid.Column="1" Text="&#xf002;" HorizontalAlignment="Center" VerticalAlignment="Center" Margin="0 0 3 0" FontSize="25" FontFamily="../Fonts/#FontAwesome"/>
                        <!-- ScrollViewer此标签必须有,不然TextBox里的内容无法显示 -->
                        <ScrollViewer x:Name="PART_ContentHost" Focusable="False" HorizontalScrollBarVisibility="Hidden"
                                              VerticalScrollBarVisibility="Hidden" Grid.Column="0" VerticalAlignment="Center"/>
					</Grid>
				</Border>
				<ControlTemplate.Triggers>
					<Trigger Property="IsEnabled" Value="False">
                    	<Setter Property="Opacity" TargetName="border" Value="0.56"/>
                    </Trigger>
                    <Trigger Property="IsMouseOver" Value="True">
                    	<Setter Property="BorderBrush" TargetName="border" Value="#FF7EB4EA"/>
                    </Trigger>
                    <Trigger Property="IsKeyboardFocused" Value="True">
                        <Setter Property="BorderBrush" TargetName="border" Value="#FF569DE5"/>
                    </Trigger>
                    <!-- DataTrigger实现当用户输入内容时,显示输入的内容,当用户清空时,显示水印 -->
					<DataTrigger Binding="{Binding Path=Text, RelativeSource={RelativeSource Mode=Self}}" Value="">
                    	<Setter Property="Visibility" TargetName="markText" Value="Visible"/>
                    </DataTrigger>
				</ControlTemplate.Triggers>
			</ControlTemplate>
		</Setter.Value>
	</Setter>
</Style>

效果图:
在这里插入图片描述

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
WPF 中可以通过路由实现控件的联动,比如当一个控件的值改变时,另一个控件的值也跟着改变。 具体实现可以通过以下步骤: 1. 使用 `DependencyProperty` 定义一个依赖属性,用于存储控件的值。 2. 在控件的 XAML 中,将该依赖属性绑定到控件的值属性上。 3. 使用 `PropertyChangedCallback` 方法监听值的变化,在方法中通过路由查找找到需要联动的控件,并将其值更新。 以下是一个实现两个 `TextBox` 联动的示例代码: ``` public class TextBoxHelper { public static readonly DependencyProperty TextProperty = DependencyProperty.RegisterAttached("Text", typeof(string), typeof(TextBoxHelper), new PropertyMetadata(null, OnTextChanged)); public static string GetText(DependencyObject obj) { return (string)obj.GetValue(TextProperty); } public static void SetText(DependencyObject obj, string value) { obj.SetValue(TextProperty, value); } private static void OnTextChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { // 获取路由根节点 var root = (FrameworkElement)Application.Current.MainWindow; // 查找需要联动的控件 var textBoxes = FindVisualChildren<TextBox>(root); // 更新控件的值 foreach (var textBox in textBoxes) { if (textBox != d) { textBox.Text = e.NewValue as string; } } } private static IEnumerable<T> FindVisualChildren<T>(DependencyObject obj) where T : DependencyObject { if (obj != null) { for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++) { DependencyObject child = VisualTreeHelper.GetChild(obj, i); if (child is T t) { yield return t; } foreach (T childOfChild in FindVisualChildren<T>(child)) { yield return childOfChild; } } } } } ``` 在 XAML 中,将 `Text` 属性绑定到 `TextBoxHelper` 中定义的依赖属性,实现联动: ``` <TextBox local:TextBoxHelper.Text="{Binding Text1, Mode=TwoWay}" /> <TextBox local:TextBoxHelper.Text="{Binding Text2, Mode=TwoWay}" /> ``` 其中,`Text1` 和 `Text2` 分别为两个 `TextBox` 的值。 这样,当一个 `TextBox` 的值改变时,另一个 `TextBox` 的值也会跟着改变。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值