点击文本框后删除文本

16

当您启动应用程序时,将出现一个带有文字“hello”的文本框。

我的问题是:
当您点击文本框以输入数据时,我想在XAML代码中自动删除文本,该怎么做?

(说明:XAML是一种基于XML的标记语言,用于创建Windows Presentation Foundation (WPF)应用程序界面)

与https://dev59.com/dXRA5IYBdhLWcg3wxA5N相同 - Tor Klingberg
8个回答

34

处理UIElement.GotFocus事件,在处理程序中清除文本。您还需要删除处理程序,以便如果第二次单击TextBox,不会丢失已经输入的内容。

可以参考以下代码:

XAML:

<TextBox Text="Hello" GotFocus="TextBox_GotFocus" />

代码后置文件:

public void TextBox_GotFocus(object sender, RoutedEventArgs e)
{
   TextBox tb = (TextBox)sender;
   tb.Text = string.Empty;
   tb.GotFocus -= TextBox_GotFocus;
}

请您详细说明一下最后一行代码,它的作用是什么,为什么需要使用它?谢谢。 - Jakov
@Jakov,“您还需要删除处理程序”-> 处理程序是在XAML中分配的,GotFocus =“TextBox_GotFocus”,这将删除它,以便下次不会丢失文本。 - SH-

8
一种不需要代码后台的XAML实现。这是从我构建的自定义控件模板中复制的,您可能想要将其变成自定义控件。
基本思路是在一个Grid中有两个TextBox。顶部的是用户与之交互的实际控件,但它是不可见的(其'Opacity'为零),除非它包含文本或具有焦点。底部的包含提示文本。只有当顶部的TextBox不可见时,它才会显示出来,并且它永远不会获得焦点。
您可能需要调整可编辑TextBox上的绑定,但这应该可以让您开始工作。
    <Grid>
      <TextBox Text="This is the prompt text"
               FontStyle="Italic"
               Foreground="LightGray"
               Focusable="False">
      </TextBox>
      <TextBox Text="{Binding TextProperty, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
               Focusable="True">
          <TextBox.Style>
              <Style TargetType="TextBox">
                  <Setter Property="Opacity"
                          Value="1" />
                  <Style.Triggers>
                      <MultiTrigger>
                          <MultiTrigger.Conditions>
                              <Condition Property="IsFocused"
                                         Value="False" />
                              <Condition Property="Text"
                                         Value="" />
                          </MultiTrigger.Conditions>
                          <Setter Property="Opacity"
                                  Value="0" />
                      </MultiTrigger>
                  </Style.Triggers>
              </Style>
          </TextBox.Style>
      </TextBox>
  </Grid>

1
+1 这是一种更加 MVVM 友好的解决方案,因为它不需要任何代码后台。这也可以转换成 ControlTemplate,以便您可以使用键引用此样式。 - fatty

5

您需要实现GetFocus和LostFocus两个事件。这样,如果没有输入文本,您可以在失去焦点事件中将默认文本设置回来。

private const string defaultText = "Hello";

private void myTextBox_GotFocus(object sender, RoutedEventArgs e)
{
   myTextBox.Text = myTextBox.Text == defaultText ? string.Empty : myTextBox.Text;
}

private void myTextBox_LostFocus(object sender, RoutedEventArgs e)
{
   myTextBox.Text = myTextBox.Text == string.Empty ? defaultText : myTextBox.Text;
}

3
为了更详细地阐述 Donut 的回答,让你的文本框保留用户输入的文本,除非它是纯空格,这里是我使用的解决方案:
XAML
<TextBox Text="Search..."
         Width="250"
         Foreground="LightGray"
         GotFocus="TextBox_GotFocus"
         LostFocus="TextBox_LostFocus" />

C#

void TextBox_GotFocus( object sender, RoutedEventArgs e )
{
    TextBox box = sender as TextBox;
    box.Text = string.Empty;
    box.Foreground = Brushes.Black;
    box.GotFocus -= TextBox_GotFocus;
}

void TextBox.LostFocus( object sender, RoutedEventArgs e )
{
    TextBox box = sender as TextBox;
    if( box.Text.Trim().Equals( string.Empty ) )
    {
        box.Text = "Search...";
        box.Foreground = Brushes.LightGray;
        box.GotFocus += TextBox_GotFocus;
    }
}

0
我想更新Donut的答案(适用于Windows 8)。
代码背后可能是这样的。
public void TextBox_GotFocus(object sender, RoutedEventArgs e)
{

   TextBox tb = (TextBox)sender;

   if(tb.Text != "SOME DEFAULT TEXT")
   {

     String persentContentWithDefaultString = t.Text as string;
     tb.Text = persentContentWithDefaultString[0].ToString();
     // set cursor position 
      tb.Select(1, 0);         

      tb.GotFocus -= TextBox_GotFocus;
 }
}

实际上,在我的页面上,有两个文本框和一个按钮。[用户名、密码和点击按钮]。默认情况下,焦点会移到我的第一个文本框上,用户无法看到默认文本。


0
我刚刚做了这个:
XAML:
<TextBox Name="Filename"
         Grid.Column="0" 
         Height="23" 
         Margin="10,9,0,0" 
         Text="Enter Export Filename here" 
         Width="193"
         GotFocus="Filename_GotFocus"
         />

代码后台:

 private void Filename_GotFocus(object sender, RoutedEventArgs e)
        {
            Filename.Text = "";            
        }

1
当然,流行的响应会按照广告中所说的那样,在您开始输入时保留已经输入的内容。我的答案是每次获得焦点时都清除文本框中的内容。 - Petermac

0

你也可以使用 Tap 方法,它同样有效。

private void tb1_Tap(object sender, System.Windows.Input.GestureEventArgs e)
    {
        tb1.Text = "";
    }

0
请不要过于复杂化答案,有多种方法可以解决问题,但是我认为代码越少越好。
对我来说,Petermac的选项是最好的选择。
在主Xaml窗口中添加“GotFocus”到控件(例如“文本框”)。
    private void Filename_GotFocus(object sender, RoutedEventArgs e)
    {
        Filename.Text = "";            
    }

或者我喜欢这个选项

    private void Filename_GotFocus(object sender, RoutedEventArgs e)
    {
        Filename.clear();            
    }

这个问题的要求只是清空文本框。


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