我想创建一个文本框,如果它是
a) 空的
b) 失去焦点
当用户输入文本框时,灰色的“默认”文本应该会消失。
我尝试使用 来执行此操作ControlTemplate.Triggers
,但我似乎找不到HasFocus
属性。
使用 XAML 执行此操作的最佳方法是什么?
虽然重新发明轮子并没有真正的好处,但看看如何做到这一点可能会很有趣。执行此操作的最简单方法(在纯 XAML 中)是为 a 创建一个ControlTemplate
在它没有聚焦且不包含文本时TextBox
覆盖 a 的方法:TextBlock
<ControlTemplate TargetType="TextBox">
<Grid>
<TextBox Text="{Binding Text, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}, UpdateSourceTrigger=PropertyChanged}" />
<TextBlock HorizontalAlignment="Center"
VerticalAlignment="Center"
Text="Your Prompt Here"
Margin="5,0,5,0"
Foreground="#FF808080"
FontStyle="Italic"
IsHitTestVisible="False"
x:Name="UserMessage"
Visibility="Hidden"/>
</Grid>
<ControlTemplate.Triggers>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="Text" Value=""/>
<Condition Property="IsKeyboardFocusWithin" Value="False"/>
</MultiTrigger.Conditions>
<Setter Property="Visibility" TargetName="UserMessage" Value="Visible"/>
</MultiTrigger>
</ControlTemplate.Triggers>
</ControlTemplate>
意思是“如果属性为空并且 TextBox 没有键盘焦点,则将MultiTrigger
Visibility 设置为 Visible ”Text
如果您想让它更可重用,那么您可以使用它作为默认模板创建一个自定义控件,并使用包含提示消息的依赖属性
您可以简单地使用Extended WPF Toolkit的WatermarkTextBox。
我根据您对如何在项目中添加和使用库的评论编写了一个小指南。
步骤 1)在您的项目中右键单击References
并选择Add Reference
.
步骤 2)找到并添加 dll 文件WPFToolkit.Extended.dll
。
步骤 3)最后您需要添加XAML
代码。
<Window x:Class="WpfApplication2.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:extToolkit="http://schemas.xceed.com/wpf/xaml/toolkit"
Title="MainWindow" Height="350" Width="525">
<Grid>
<extToolkit:WatermarkTextBox Watermark="Enter First Name" />
</Grid>
</Window>
这里的关键是将 .dll 添加reference
到 dll 文件中。
xmlns:extToolkit="http://schemas.xceed.com/wpf/xaml/toolkit"
然后你可以XAML
像这样简单地使用它。
<extToolkit:WatermarkTextBox Watermark="Enter First Name" />