如何添加提示文本到WPF文本框?

例如,当文本框为空时,Facebook在search文本框中有一个“search”提示文本。

如何用WPF文本框实现这一点?

Facebook的搜索文本框

使用VisualBrushStyle一些触发器,您可以更轻松地完成此任务:

 <TextBox> <TextBox.Style> <Style TargetType="TextBox" xmlns:sys="clr-namespace:System;assembly=mscorlib"> <Style.Resources> <VisualBrush x:Key="CueBannerBrush" AlignmentX="Left" AlignmentY="Center" Stretch="None"> <VisualBrush.Visual> <Label Content="Search" Foreground="LightGray" /> </VisualBrush.Visual> </VisualBrush> </Style.Resources> <Style.Triggers> <Trigger Property="Text" Value="{x:Static sys:String.Empty}"> <Setter Property="Background" Value="{StaticResource CueBannerBrush}" /> </Trigger> <Trigger Property="Text" Value="{x:Null}"> <Setter Property="Background" Value="{StaticResource CueBannerBrush}" /> </Trigger> <Trigger Property="IsKeyboardFocused" Value="True"> <Setter Property="Background" Value="White" /> </Trigger> </Style.Triggers> </Style> </TextBox.Style> </TextBox> 

为了增加此Style可重用性,您还可以创build一组附加属性来控制实际的提示横幅文本,颜色,方向等。

这是我简单的解决scheme,从微软改编( https://code.msdn.microsoft.com/windowsapps/How-to-add-a-hint-text-to-ed66a3c6

  <Grid Background="White" HorizontalAlignment="Right" VerticalAlignment="Top" > <!-- overlay with hint text --> <TextBlock Margin="5,2" MinWidth="50" Text="Suche..." Foreground="LightSteelBlue" Visibility="{Binding ElementName=txtSearchBox, Path=Text.IsEmpty, Converter={StaticResource MyBoolToVisibilityConverter}}" /> <!-- enter term here --> <TextBox MinWidth="50" Name="txtSearchBox" Background="Transparent" /> </Grid> 

通过将文本颜色设置为灰色并添加事件处理程序来获取和丢失键盘焦点,在代码隐藏中执行此操作。

 TextBox tb = new TextBox(); tb.Foreground = Brushes.Gray; tb.Text = "Text"; tb.GotKeyboardFocus += new KeyboardFocusChangedEventHandler(tb_GotKeyboardFocus); tb.LostKeyboardFocus += new KeyboardFocusChangedEventHandler(tb_LostKeyboardFocus); 

然后事件处理程序:

 private void tb_GotKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e) { if(sender is TextBox) { //If nothing has been entered yet. if(((TextBox)sender).Foreground == Brushes.Gray) { ((TextBox)sender).Text = ""; ((TextBox)sender).Foreground = Brushes.Black; } } } private void tb_LostKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e) { //Make sure sender is the correct Control. if(sender is TextBox) { //If nothing was entered, reset default text. if(((TextBox)sender).Text.Trim().Equals("")) { ((TextBox)sender).Foreground = Brushes.Gray; ((TextBox)sender).Text = "Text"; } } } 

您必须通过inheritance文本框来创build自定义控件。 下面的链接有一个关于search文本框样本的很好的例子。 请看看这个

http://davidowens.wordpress.com/2009/02/18/wpf-search-text-box/

你可以做一个非常简单的方法。 这个想法是将一个标签放在与您的文本框相同的地方。 如果文本框没有文本并且没有焦点,您的标签将是可见的。

  <Label Name="PalceHolder" HorizontalAlignment="Left" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" Height="40" VerticalAlignment="Top" Width="239" FontStyle="Italic" Foreground="BurlyWood">PlaceHolder Text Here <Label.Style> <Style TargetType="{x:Type Label}"> <Setter Property="Visibility" Value="Hidden"/> <Style.Triggers> <MultiDataTrigger> <MultiDataTrigger.Conditions> <Condition Binding ="{Binding ElementName=PalceHolder, Path=Text.Length}" Value="0"/> <Condition Binding ="{Binding ElementName=PalceHolder, Path=IsFocused}" Value="False"/> </MultiDataTrigger.Conditions> <Setter Property="Visibility" Value="Visible"/> </MultiDataTrigger> </Style.Triggers> </Style> </Label.Style> </Label> <TextBox Background="Transparent" Name="TextBox1" HorizontalAlignment="Left" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" Height="40"TextWrapping="Wrap" Text="{Binding InputText,Mode=TwoWay}" VerticalAlignment="Top" Width="239" /> 

奖励:如果您希望为您的文本框设置默认值,请务必在提交数据时设置它(例如:“InputText”=“PlaceHolder Text Here”如果为空)。

我使用了获得和失去的重点事件:

 Private Sub txtSearchBox_GotFocus(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles txtSearchBox.GotFocus If txtSearchBox.Text = "Search" Then txtSearchBox.Text = "" Else End If End Sub Private Sub txtSearchBox_LostFocus(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles txtSearchBox.LostFocus If txtSearchBox.Text = "" Then txtSearchBox.Text = "Search" Else End If End Sub 

它运作良好,但文本仍然灰色。 需要清理。 我正在使用VB.NET

  <Grid> <TextBox Name="myTextBox"/> <TextBlock> <TextBlock.Style> <Style TargetType="TextBlock"> <Style.Triggers> <DataTrigger Binding="{Binding ElementName=myTextBox, Path=Text.IsEmpty}" Value="True"> <Setter Property="Text" Value="Prompt..."/> </DataTrigger> </Style.Triggers> </Style> </TextBlock.Style> </TextBlock> </Grid> 

另一种方法;-)

这也适用于PasswordBox 。 如果你想使用它与TextBox ,只需与TextChanged交换PasswordChanged

XAML:

 <Grid> <!-- overlay with hint text --> <TextBlock Margin="5,2" Text="Password" Foreground="Gray" Name="txtHintPassword"/> <!-- enter user here --> <PasswordBox Name="txtPassword" Background="Transparent" PasswordChanged="txtPassword_PasswordChanged"/> </Grid> 

代码隐藏:

 private void txtPassword_PasswordChanged(object sender, RoutedEventArgs e) { txtHintPassword.Visibility = Visibility.Visible; if (txtPassword.Password.Length > 0) { txtHintPassword.Visibility = Visibility.Hidden; } } 

另一个解决scheme是使用像MahApps.Metro这样的WPF工具箱。 它有很多很好的function,如文本框水印:

Controls:TextBoxHelper.Watermark="Search..."

请参阅http://mahapps.com/controls/textbox.html

我用一个VisualBrush和一些由sellmeadogbuild议的Style了一个触发器。

 <TextBox> <TextBox.Style> <Style TargetType="TextBox" xmlns:sys="clr-namespace:System;assembly=mscorlib"> <Style.Resources> <VisualBrush x:Key="CueBannerBrush" AlignmentX="Left" AlignmentY="Center" Stretch="None"> <VisualBrush.Visual> <Label Content="Search" Foreground="LightGray" /> </VisualBrush.Visual> </VisualBrush> </Style.Resources> <Style.Triggers> <Trigger Property="Text" Value="{x:Static sys:String.Empty}"> <Setter Property="Background" Value="{StaticResource CueBannerBrush}" /> </Trigger> <Trigger Property="Text" Value="{x:Null}"> <Setter Property="Background" Value="{StaticResource CueBannerBrush}" /> </Trigger> <Trigger Property="IsKeyboardFocused" Value="True"> <Setter Property="Background" Value="White" /> </Trigger> </Style.Triggers> </Style> </TextBox.Style> </TextBox> 

@sellmeadog:应用程序运行,btdevise不加载…下面的错误是: 模糊的types引用。 名为“StaticExtension”的types至less出现在两个名称空间“MS.Internal.Metadata.ExposedTypes.Xaml”和“System.Windows.Markup”中。 考虑调整assemblyXmlnsDefinition属性。 使用.net 3.5

对于WPF,没有办法。 你必须模仿它。 看到这个例子 。 辅助(片状解决scheme)是承载从TextBoxinheritance的WinForms用户控件,并将EM_SETCUEBANNER消息发送到编辑控件。 即。

 [DllImport("user32.dll", CharSet = CharSet.Auto)] private static extern IntPtr SendMessage(IntPtr hWnd, Int32 msg, IntPtr wParam, IntPtr lParam); private const Int32 ECM_FIRST = 0x1500; private const Int32 EM_SETCUEBANNER = ECM_FIRST + 1; private void SetCueText(IntPtr handle, string cueText) { SendMessage(handle, EM_SETCUEBANNER, IntPtr.Zero, Marshal.StringToBSTR(cueText)); } public string CueText { get { return m_CueText; } set { m_CueText = value; SetCueText(this.Handle, m_CueText); } 

此外,如果您想要托pipe一个WinForm控件方法,我有一个框架已经包含这个实现称为BitFlex框架,您可以在这里免费下载 。

如果你想了解更多的信息, 这里有一篇关于BitFlex 的文章 。 您将开始发现,如果您正在寻找具有Windows资源pipe理器风格的控件,这通常不会出现,因为WPF通常不能处理句柄,所以不能在Win32或现有的控件上编写简单的包装,例如与WinForms。

截图: 在这里输入图像描述