在我的开发生涯中,无论是 WPF 还是 Avalonia UI,使用 TextBlock 的情况要比 Label 多得多。作为一个不求甚解的程序员,之前我只知道在数据绑定时,TextBlock 使用 Text 属性,而 Label 使用 Content 属性。甚至对于到底在什么时候用 TextBlock ,什么时候用 Label 也没有一个清晰的认识。
Label 控件
Label 继承自 ContentControl。这意味着它不仅可以包含文本,还可以包含复杂的内容,比如按钮、图像等。最重要的是,Label 具有无障碍功能,这在提升用户体验方面起着重要作用。
Label 的真正功能在于它可以指定一个 Target,即指向另一个控件,如文本框。这样,当用户点击 Label 或使用访问键时,焦点会自动转移到目标控件上。访问键可以通过在 Label 的文本中加下划线的方式指定。当界面启动时,按下 ALT 加指定的字母键,就能把焦点转移到目标控件上。
例如,如果在 Label 的内容中某个字母前加个下划线,如 “_S” 表示 SearchBox,那么启动界面后按下 ALT + S 就能将焦点转移到 SearchBox 上。这大大提高了界面的无障碍性和用户体验,尤其对需要键盘操作的用户非常友好。
<StackPanel Spacing="5">
<Label Content="_Find" Target="{Binding ElementName=FindBox}"></ Label>
<TextBox x:Name="FindBox"/>
<Label Content="_Search" Target="{Binding ElementName=SearchBox}"/>
<TextBox x:Name="SearchBox"/>
</StackPanel>
TextBlock 控件
与 Label 不同,TextBlock 继承自 Control,主要用于显示只读文本。它是一个轻量级控件,主要属性是 Text。TextBlock 支持内嵌格式化,例如通过 Run 标签可以部分文本加粗或改变颜色。
TextBlock 适用于需要显示静态文本的场景,如标签、提示信息或文章内容等。由于它没有 Label 的无障碍功能(如 Target 和 AccessKey),在需要单纯显示文本的地方,使用 TextBlock 更加简洁和高效。
<TextBlock>
<Run Text="This is a " />
<Run Text="bold" FontWeight="Bold" />
<Run Text=" text." />
</TextBlock>
为什么 Label 用得比较少?
- 无障碍设计意识不足: 很多开发者在设计 UI 时往往忽视了无障碍功能的实现。尽管无障碍功能对提升用户体验非常重要,但由于认识和重视程度不足,Label 的使用频率因此较低。
- 简单需求使用 TextBlock 即可满足: 在许多简单场景中,只需要显示文本内容,使用 TextBlock 就足够了。 Label 的一些特性在这些场景中没有发挥的空间,因此 TextBlock 更加常见。
总结如下
Label:适用于需要标识其他控件并增强无障碍功能的场景。它的 Target 和 AccessKey 功能可以显著提升用户体验,特别是对于键盘操作和无障碍需求的用户。
TextBlock:适用于简单的文本显示场景,使用起来更加简洁和高效。