TextBox控件是WPF中最基本的文字输入控件。它允许最终用户在一行、对话输入、或多行编写,就像是个编辑器。
TextBox控件非常常用。你可以不使用任何属性,就能有一个完整并可编辑的文本字段。这里有一个简单的示例:
<Window x:Class="WpfTutorialSamples.Basic_controls.TextBoxSample"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="TextBoxSample" Height="80" Width="250">
<StackPanel Margin="10">
<TextBox />
</StackPanel>
</Window>
这就是你获取一个文本字段所需要的全部了,在运行这个示例之后,以及在截屏之前,我加入了一些文本,你也可以通过标签的方式来做,通过使用Text属性去预先为文本框填充内容。
<TextBox Text="Hello, world!" />
尝试在文本框里鼠标右击。你会得到一个选项菜单,允许你和Windows剪贴板一块使用这个TextBox。默认的撤销和重做的键盘快捷方式(Ctrl + Z 和 Ctrl + Y)也应该是起作用的,并且所有这些功能你能够不受限制的使用。
如果你运行上面的例子,你会注意到,文本框控件默认是一个单行控件。当你按下 Enter时,啥事也不会发生,并且如果你添加比一个单行文本框所能容纳的长度还要多的内容时,控件就出滚动条了。不过,使一个TextBox控件变成一个多行编辑器是非常简单的:
<Window x:Class="WpfTutorialSamples.Basic_controls.TextBoxSample"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="TextBoxSample" Height="160" Width="280">
<Grid Margin="10">
<TextBox AcceptsReturn="True" TextWrapping="Wrap" />
</Grid>
</Window>
我添加了两个属性:AcceptsReturn使得TextBox变成一个多行控件,允许使用 回车/返回键进入到下一行, 和TextWrapping属性,当内容到达一行的尾部时,它会使文本能够自动被包裹起来。
作为额外的好处,TextBox控件实际上带有英语和其他几种语言(as of writing、英语、法语、德语和西班牙语)的自动拼写检查。
它非常类似于微软Word,其中拼写错误被划线,您可以右键单击它的建议替代品。启用拼写检查非常容易:
<Window x:Class="WpfTutorialSamples.Basic_controls.TextBoxSample"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="TextBoxSample" Height="160" Width="280">
<Grid Margin="10">
<TextBox AcceptsReturn="True" TextWrapping="Wrap" SpellCheck.IsEnabled="True" Language="en-US" />
</Grid>
</Window>
我们使用前面的多行文本框示例作为基础,然后添加了两个新属性:SpellCheck类中名为IsEnabled的附加属性,该属性仅支持对父控件进行拼写检查,以及Language属性,该属性指示拼写检查器使用的语言。
就像Windows中的任何其他可编辑控件一样,TextBox允许选择文本,例如一次删除整个单词或将文本的一部分复制到剪贴板。WPF文本框具有用于处理选定文本的多个属性,所有这些属性都可以读取或修改。在下一个示例中,我们将读取这些属性:
<Window x:Class="WpfTutorialSamples.Basic_controls.TextBoxSelectionSample"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="TextBoxSelectionSample" Height="150" Width="300">
<DockPanel Margin="10">
<TextBox SelectionChanged="TextBox_SelectionChanged" DockPanel.Dock="Top" />
<TextBox Name="txtStatus" AcceptsReturn="True" TextWrapping="Wrap" IsReadOnly="True" />
</DockPanel>
</Window>
该示例由两个文本框控件组成:一个用于编辑,另一个用于输出当前的选择状态。为此,我们将IsReadOnly属性设置为true,以防止对状态文本框的编辑。我们在第一个文本框中订阅SelectionChanged事件,我们在后面的代码中处理:
using System;
using System.Text;
using System.Windows;
using System.Windows.Controls;
namespace WpfTutorialSamples.Basic_controls
{
public partial class TextBoxSelectionSample : Window
{
public TextBoxSelectionSample()
{
InitializeComponent();
}
private void TextBox_SelectionChanged(object sender, RoutedEventArgs e)
{
TextBox textBox = sender as TextBox;
txtStatus.Text = "Selection starts at character #" + textBox.SelectionStart + Environment.NewLine;
txtStatus.Text += "Selection is " + textBox.SelectionLength + " character(s) long" + Environment.NewLine;
txtStatus.Text += "Selected text: '" + textBox.SelectedText + "'";
}
}
}
我们使用三个相关的属性来实现:
SelectionStart,它给出了当前光标位置或是否有选择:它从什么位置开始。
SelectionLength,它给出了当前选择的长度,如果有的话。 否则它将返回0。
SelectedText,如果有选择,它会给我们当前选择的字符串。 否则返回一个空字符串。
所有这些属性都是可读的和可写的,这意味着您也可以修改它们。例如,您可以设置SelectionStart和SelectionLength属性以选择自定义文本范围,或者可以使用SelectedText属性插入和选择字符串。请记住,文本框必须具有焦点,例如首先调用Focus()方法,以便工作。