单击文本框后删除文本

时间:2011-08-07 12:13:36

标签: c# .net wpf xaml

激活应用程序时,将出现带有文本“hello”的文本框。

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

8 个答案:

答案 0 :(得分:27)

处理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;
}

答案 1 :(得分:7)

不需要代码隐藏的XAML实现。这是从我构建的自定义控件的模板中复制而来的,您可能希望自己将其设置为自定义控件。

基本思路是TextBox中有两个Grid es。最上面的一个是用户与之交互的实际控件,但它是不可见的(它的'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>

答案 2 :(得分: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 :(得分:2)

要阐述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;
    }
}

答案 4 :(得分: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 = "";            
        }

答案 5 :(得分:0)

我想更新甜甜圈的答案。(适用于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;
 }
}

在我的页面中,有两个文本框和一个按钮。 [用户名,通过和单击按钮]。默认情况下,焦点转到我的第一个文本框,用户无法看到默认文本。

答案 6 :(得分:0)

你也可以使用Tap方法,它也可以使用

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

答案 7 :(得分:0)

请不要过于简单地回答几种方法给猫皮肤化,但是, 我想你的代码越少越好。

彼得马克的选择是我的选择。

在主Xaml窗口中将“GotFocus”添加到控件,例如“textbox”

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

或者我喜欢这个选项

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

问的问题只是清空文本框。