-
基础控件:

TextBox控件

TextBox控件是WPF中最基本的文字输入控件。它允许最终用户在一行、对话输入、或多行编写,就像是个编辑器。

单行TextBox

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

作为额外的好处,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属性,该属性指示拼写检查器使用的语言。

使用TextBox的选择属性

就像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()方法,以便工作。