在C#的桌面应用开发中,文本框是常用的用户输入控件,很多时候我们需要让文本框显示内容但禁止用户编辑,这时候就需要设置文本框的只读属性。不同的UI框架中文本框的只读设置方式存在区别,同时还有不同的属性可以实现类似的效果,需要开发者根据场景选择。

WinForms中TextBox只读属性设置
WinForms的TextBox控件提供了ReadOnly属性来设置只读状态,同时也可以通过Enabled属性实现类似效果,两者存在明显区别。
使用ReadOnly属性设置
将ReadOnly属性设置为true后,文本框中的内容可以被选中、复制,但是用户无法通过键盘输入或修改内容,背景色默认保持白色,和正常文本框的视觉差异较小。
可以在窗体设计器中直接设置,也可以在代码中动态修改,以下是代码设置的示例:
// 设置文本框为只读状态 textBox1.ReadOnly = true; // 设置文本框为可编辑状态 textBox1.ReadOnly = false; // 判断文本框是否为只读 bool isReadOnly = textBox1.ReadOnly;
使用Enabled属性设置
将Enabled属性设置为false后,文本框会变为灰色不可用状态,用户无法选中内容也无法修改,和ReadOnly属性的表现不同。
// 设置文本框不可用 textBox1.Enabled = false; // 设置文本框可用 textBox1.Enabled = true;
两种属性的区别对比
| 属性 | 内容可修改 | 内容可选中复制 | 背景色 | 响应事件 |
|---|---|---|---|---|
| ReadOnly=true | 否 | 是 | 白色 | 响应鼠标点击、选中事件 |
| Enabled=false | 否 | 否 | 灰色 | 不响应任何鼠标键盘事件 |
WPF中TextBox只读属性设置
WPF的TextBox控件同样有IsReadOnly属性,作用和WinForms的ReadOnly属性一致,同时也有IsEnabled属性对应WinForms的Enabled属性。
使用IsReadOnly属性设置
在XAML中可以直接设置属性,也可以在后台代码中修改,以下是两种方式的示例:
XAML中设置:
<TextBox x:Name="txtDemo" IsReadOnly="True" Text="只读文本内容"/>
后台代码设置:
// 设置只读 txtDemo.IsReadOnly = true; // 取消只读 txtDemo.IsReadOnly = false;
使用IsEnabled属性设置
设置为false后文本框变为不可用状态,内容和交互都被禁用:
// 设置不可用 txtDemo.IsEnabled = false; // 设置可用 txtDemo.IsEnabled = true;
设置只读属性的注意事项
- 如果只需要禁止用户编辑,但是需要支持内容选中和复制,优先选择
ReadOnly(WinForms)或IsReadOnly(WPF)属性。 - 如果需要完全禁用文本框的所有交互,让文本框显示为不可用状态,选择
Enabled(WinForms)或IsEnabled(WPF)属性。 - 只读状态下,后台代码仍然可以正常修改文本框的
Text属性,不会因为只读限制后台赋值。 - 如果文本框绑定了数据源,只读属性不会影响数据源的更新,仅限制用户的界面输入操作。
动态切换只读状态示例
以下是一个WinForms中根据复选框状态动态切换文本框只读状态的完整示例:
private void checkBox1_CheckedChanged(object sender, EventArgs e)
{
// 复选框选中时设置文本框为只读,取消选中时取消只读
if (checkBox1.Checked)
{
textBox1.ReadOnly = true;
textBox1.Text = "当前文本框为只读状态,无法编辑";
}
else
{
textBox1.ReadOnly = false;
textBox1.Text = "当前文本框可编辑";
}
}