使用XAML使“默认”文本显示在没有焦点的空TextBox中

时间:2012-05-03 09:05:20

标签: c# wpf xaml

我想创建一个TextBox,如果它是

,它会显示一个灰色的“默认”文本

a)空

b)失去了焦点

当用户输入文本框时,灰色的“默认”文本应该消失。

我尝试使用ControlTemplate.Triggers执行此操作,但我似乎无法找到HasFocus属性。

使用XAML执行此操作的最佳方法是什么?

2 个答案:

答案 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 ToolkitWatermarkTextBox即可。 enter image description here

我根据您对如何在项目中添加和使用库的评论撰写了一个小指南。

步骤1)右键点击项目中的References,然后选择Add Reference

Step 1

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

Step 2

步骤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" />