我想创建一个TextBox,如果它是
,它会显示一个灰色的“默认”文本a)空
b)失去了焦点
当用户输入文本框时,灰色的“默认”文本应该消失。
我尝试使用ControlTemplate.Triggers
执行此操作,但我似乎无法找到HasFocus
属性。
使用XAML执行此操作的最佳方法是什么?
答案 0 :(得分:17)
虽然重新发明轮子没有任何实际好处,但看看如何做到这一点可能会很有趣。最简单的方法(在纯XAML中)是为ControlTemplate
创建一个TextBox
,当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>
:
MultiTrigger
Text
表示“如果{{1}}属性为空并且TextBox没有键盘焦点,则将可见性设置为可见”
如果你想让它更加可重用,那么你可以用它作为默认模板创建一个自定义控件,并使用包含提示信息的Dependency属性
答案 1 :(得分:12)
您只需使用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>
这里的关键是将reference
添加到dll文件中。
xmlns:extToolkit="http://schemas.xceed.com/wpf/xaml/toolkit"
然后你可以在XAML
这样简单地使用它。
<extToolkit:WatermarkTextBox Watermark="Enter First Name" />