使用XAML使空的文本框中出现“默认”文本,无需聚焦。

13
我希望创建一个文本框(TextBox),当文本框为空或失去焦点时,会显示灰色的“默认”文本。当用户进入文本框时,灰色的“默认”文本应该消失。
我尝试使用ControlTemplate.Triggers实现,但似乎找不到HasFocus属性。有没有更好的方法在XAML中实现这个功能?

1
我同意@Fuji的建议,建议使用WatermarkTextBox,但是作为将来的参考,HasFocus的等效项是IsKeyboardFocused。http://msdn.microsoft.com/en-us/library/system.windows.uielement.iskeyboardfocused.aspx - Steve Greatrex
2个回答

25

虽然重新发明轮子没有真正的好处,但是了解如何这样做可能会很有趣。最简单的方法(在纯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”。

如果想要使其更具可重用性,可以创建一个自定义控件,其中包含该内容的默认模板以及一个包含提示信息的依赖属性。


7
我同意在简单应用程序中偶尔使用纯XAML很好。除非需要频繁使用,否则我不喜欢将第三方dll添加到项目中。 - eandersson
@fuji,了解这些东西的实际工作原理是很好的! - Steve Greatrex
@SteveGreatrex,我该如何为不同的文本创建自定义控件,例如Text="Your Prompt Here",另一个文本框中我需要的文本是"You Prompt There"。 - abc cba

14
你可以简单地使用Extended WPF ToolkitWatermarkTextBox。我基于你的评论写了一个小指南,介绍如何在项目中添加和使用该库。 步骤1) 在你的项目中右键点击References并选择Add Reference

Step 1

步骤2) 找到并添加dll文件WPFToolkit.Extended.dll

Step 2

第三步) 最后您需要添加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" />

这是一个你可以从我给你链接的网站上下载的自定义库。http://wpftoolkit.codeplex.com/releases/view/84227 - eandersson
是的,我做了那个。但是我需要引用它才能得到水印文本框。那个库里有几个程序集。我应该引用哪一个? - Arsen Zahray
在压缩文件“ExtendedWPFToolkit_Binaries.zip”中只有一个dll文件,它应该包含一个名为“WPFToolkit.Extended.dll”的dll文件,您需要将其作为“引用”添加到“Visual Studio”中。 - eandersson
啊,我把它和WPF工具包混淆了。谢谢! - Arsen Zahray
没问题,很高兴你找到了解决方案。 ;) - eandersson
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接