我希望创建一个文本框(TextBox),当文本框为空或失去焦点时,会显示灰色的“默认”文本。当用户进入文本框时,灰色的“默认”文本应该消失。
我尝试使用ControlTemplate.Triggers实现,但似乎找不到HasFocus属性。有没有更好的方法在XAML中实现这个功能?
我尝试使用ControlTemplate.Triggers实现,但似乎找不到HasFocus属性。有没有更好的方法在XAML中实现这个功能?
虽然重新发明轮子没有真正的好处,但是了解如何这样做可能会很有趣。最简单的方法(在纯XAML中)是为TextBox
创建一个ControlTemplate
,当它不聚焦或不包含文本时,该模板将覆盖一个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
属性为空且 TextBox 没有键盘焦点,则将 Visibility 设置为 Visible”。
如果想要使其更具可重用性,可以创建一个自定义控件,其中包含该内容的默认模板以及一个包含提示信息的依赖属性。
References
并选择Add Reference
。
步骤2) 找到并添加dll文件WPFToolkit.Extended.dll
。
第三步) 最后您需要添加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" />
WatermarkTextBox
,但是作为将来的参考,HasFocus
的等效项是IsKeyboardFocused
。http://msdn.microsoft.com/en-us/library/system.windows.uielement.iskeyboardfocused.aspx - Steve Greatrex