【问题标题】:Prevent user from exiting `UserControl` with pressing tab防止用户通过按 Tab 退出 `UserControl`
【发布时间】:2014-07-22 22:31:20
【问题描述】:

我有一个UserControl,其中包含一个按钮和一个文本框。用户应该再次填写文本框并单击按钮 - 以便将数据发送到表单并隐藏用户控件,或者在文本框上按 Escape - 以便表单知道用户已取消进度。

问题是当用户按下文本框上的选项卡时,用户控件被离开(并且之后隐藏 - 由于离开时隐藏用户控件的策略),因此更近的数据被发送到表单,用户也没有取消进步。

所有用户控件、文本框和里面的按钮都将它们的TabStop 设置为 false,但用户仍然可以通过按 Tab 键返回表单。

如何阻止此用户控件上的选项卡功能?我想制定规则:点击按钮或按 Escape,没有标签失控,就是这样。

【问题讨论】:

  • 那是非常糟糕的 UI 设计。您不应该阻止用户以熟悉的方式使用键盘。您应该重新考虑如何处理输入。
  • 我刚刚在我的答案中发布了一个链接,其中包含一个示例,其中展示了如何几乎完全满足您的需求。
  • @xxbbcc:我同意,这些东西最好按预期保留,甚至加以利用。使用与 UI 指南相差太远的软件,受损者可能会遇到巨大的麻烦。不过,他想要一个答案。谁知道他为什么需要这个?
  • @xxbbcc 我知道这是不可接受的方式,但不幸的是,我的客户是一家为实际上是老年人和传统人的人构建应用程序的公司,所以他们想要自己的做事方式:)

标签: c# user-controls tabstop


【解决方案1】:

在表单中的所有其他控件上将TabStop 设置为false,以便在选项卡上保持焦点不变。否则,在 OnKeyDown 或 OnKeyPress 事件中吞下按键。单出 Tab 键并防止其被进一步处理:capture key presses

【讨论】:

  • 感谢您的回答,但我之前已经对此进行了测试,这种方法的问题是您完全失去了标签的使用。有没有其他方法可以在用户控件中捕获 tab 键?
  • 是的,请查看我发布的链接中的示例。仅将事件处理程序附加到文本框并正确过滤。它不应该干扰表单上的任何其他内容。
【解决方案2】:

在你的 UserControl 中使用 Validating 方法:

public partial class UserControl1 : UserControl {

  public UserControl1() {
    InitializeComponent();
  }

  protected override void OnValidating(CancelEventArgs e) {
    e.Cancel = (textBox1.Text.Trim() == String.Empty);
    base.OnValidating(e);
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-28
    • 1970-01-01
    • 2012-07-11
    • 1970-01-01
    • 2018-09-23
    • 2017-02-11
    相关资源
    最近更新 更多