为什么在 C# 中启用多行的 TextBox 控件上禁用 CTRL+A 快捷键?

问题描述 投票:0回答:3

MSDN 的 文档 对于 TextBox 的 ShortcutsEnabled 属性指出:

当 Multiline 属性值为 true 时,TextBox 控件不支持 CTRL+A 快捷键。

...但是为什么呢? Kaitlyn 在下面提到,

TextBox
RichTextBox
都派生自相同的基类
TextBoxBase
,但
RichTextBox
控件本身支持快捷方式。

手动将其添加回来很容易,并且有很多问题可以回答如何执行此操作,但我想不出为什么他们会在这种特定情况下不遗余力地禁用此功能。

技术原因是什么?

c# .net visual-studio-2013 textbox msdn
3个回答
4
投票

引用别人的话,就是:

可能是因为 TextBox 包装了本机 Windows EDIT 控件,该控件仅支持快捷方式的子集。

引自 Frédéric Hamidi https://stackoverflow.com/a/5893879/3472690

经过一番研究,Frédéric 提到的本机 Windows 编辑控件似乎是 这个,在 MSDN 上,关于编辑控件

正如艾伦·麦克唐纳(Alan Macdonald)在对上面链接的同一答案的评论中所说......

多行文本框的可怕功能

编辑:

发现另一个潜在原因。引用自SuperUserDMA57361,

作为快捷键,Ctrl+A = 全选不是 Windows 实现的。

它仅适用于那些本身实现此快捷方式的程序,而不是在整个系统中普遍适用。

SuperUser 的 KCotreau 对 DMA57361 的回答的附加评论也与 xpda 关于兼容性的说法相对应(从引用中删除了名称):

它没有在 XP 或 Server 2003 中实现,但在 Windows 7 和 Server 2008(可能还有 Vista)中实现,至少对于运行框来说是这样。所以你的系统在技术上没有问题......它只是缺少一个功能。

至于 MSDN 本身的更多信息,以及与上面其他引用相对应的信息......“关于编辑控件”文章说:

丰富的编辑控件支持系统编辑控件中不可用的许多功能。有关更多信息,请参阅 Rich Edit 控件。

此外,编辑控件也有限制,正如本文引用的那样,也来自 MSDN(但是开发人员网络部分而不是 Windows 开发中心,我不确定这有什么区别。) .)

编辑控件旨在输入、显示和编辑少量文本。它们并不是大型文本编辑器的基础。


正如 xpda 所说,似乎是有意这样做的,或者他们只是不想费心去修复它,正如对有关不支持全选的多行文本框问题的回复所引用的那样Visual Studio 反馈部分的快捷方式:

我们已评估您报告的问题,在产品生命周期的此时,它不符合要解决的标准。此评估是经过仔细完成的,并考虑了许多方面,包括修复成本、更改的影响以及报告的问题实例的数量。

最后,为了进一步解释为什么这是设计使然……以及为什么这是为了“兼容性”……某个 CodeGuru 论坛上的 Shuja Ali 引用了这句话,他说

它以前从未在 VB 6.0 和 .NET 1.1 中工作

为了进一步“支持”Shuja Ali 的引用,TextBoxBase.ShortcutEnabled 属性是 .NET Framework 2.0 的新属性,并且 Ctrl+A 快捷键在该阶段已经不起作用,正如 hemantpurkar 的评论所表明的那样那篇文章


因此,将所有上述研究浓缩为一句话......

从 .NET Framework 第一个正确支持快捷键的版本(2.0)开始,就存在无法使用快捷键“Ctrl+A”的问题,而微软从那时起就懒得修复它,因此声称是“设计使然”,并为了“兼容性”而保留。


3
投票

官方给出的答案是“设计使然”。也许很久以前这样做是为了保持兼容性。您可以使用 RichTextBox 来默认获取所有快捷键,包括 Ctrl-A。


0
投票

即使使用

TextBox1.ShortcutsEnabled = True
,也无法在 TextBox 上启用 Ctrl+A。

但是我编写了一个代码来执行此操作

Private Sub TextBox1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles TextBox1.KeyDown
    If e.Control AndAlso (e.KeyCode = Keys.A) Then
        If sender IsNot Nothing Then CType(sender, TextBox).SelectAll()
        e.Handled = True
    End If
End Sub

这个想法来自 C++ 代码,用于使用多行文本框执行 Ctrl+A。

© www.soinside.com 2019 - 2024. All rights reserved.