激活应用程序时,将出现带有文本“hello”的文本框。
我的问题是:
当您单击文本框以输入数据时,我想在XAML代码中自动删除文本,我该怎么做?
答案 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();
}
问的问题只是清空文本框。