3

我遇到了一些奇怪的行为。让我尝试解释一下,我将代码精简到最低限度,但我仍然遇到问题。所以首先,我将 VS2013 与 .NET 4.0 一起使用,并且我在 Windows 8.1 上。

所以我有一个通过 a 使用的自定义UserControlTextBox如果ToolStripControlHost我专注于这个文本框并点击TAB它,它只会循环通过控件到这个文本框的 LEFT。如果我让它集中并点击SHIFT+ TAB,它会循环通过它右侧的按钮。

在此处输入图像描述

所以这是我的表格的一个例子。中间的文本框是一个自定义控件。我的代码(尽可能简化)如下所示:

[ToolStripItemDesignerAvailability(ToolStripItemDesignerAvailability.ToolStrip | ToolStripItemDesignerAvailability.StatusStrip)]
public class ToolStripTestControl : ToolStripControlHost
{
    public ToolStripTestControl() : this(new TestControl()) { }
    public ToolStripTestControl(Control c) : base(c) { }
}

public class TestControl : UserControl
{
    private TextBox _textBox = new TextBox();

    public TestControl()
    {
        _textBox.Dock = DockStyle.Fill;
        this.Controls.Add(_textBox);
    }

    protected override Size DefaultMinimumSize { get { return new Size(100, 22); } }
}

只需创建一个新的 WinForms (.NET4) 项目并按照以下步骤操作即可复制问题:

  1. 添加新的类文件并粘贴上面的代码。
  2. 建造
  3. 将 ToolStrip 添加到表单
  4. 在 ToolStrip 上添加一个 Button、我的自定义控件和另一个 Button(通过设计器是我一直在做的)

一旦运行...

  1. 专注于自定义控件
  2. 点击TAB几次,它应该只关注左边的控件。
  3. 点击SHIFT+TAB几次,它只会向右聚焦。

有谁知道问题是什么 - 或者我该如何解决这个问题?我整天都在扯头发试图解决这个问题。我终于剥离了我的代码,但我似乎无法让它工作。我什至尝试覆盖大部分OnEnter/OnGotFocus功能并自己做,但这变成了一场噩梦。

谢谢!

更新1:所以一些额外的花絮。

如果我将自定义控件更改为从 TextBox 而不是 UserControl 继承,则选项卡/焦点按预期工作。

如果我将其更改为 aControl而不是 aUserControl选项卡也可以正常工作,但是焦点永远不会进入我的内部 TextBox - 焦点似乎丢失了(或者可能在外部父控件上但没有传递到内部文本框)。

我确实看到添加的 MS Connect 项目描述了 2009 年以来的这个问题,但这个链接似乎只有在我没有登录到 Microsoft Connect 时才有效。这意味着,我不能投票或评论... http://connect.microsoft.com/VisualStudio/feedback/details/472592/tab-cycling-through-controls-with-usercontrol-on-toolstrip-doesnt -按预期执行

4

1 回答 1

5

.NET 2.0 ToolStripItem 类一直是一个主要的错误工厂。它们是无窗口控件,但重现 Windows 窗口的确切行为并不容易。下面有大量代码,其中大部分是内部代码,因此您无法修改它。当它们不能完美地模拟窗口的行为时,就会出现怪癖。您可以将它们称为“空域”问题,这与 WPF 的问题非常相似。

这里的空域问题是焦点,对于真正的窗口来说完全明确,但对于 ToolStripItem 需要伪造。它实际上是具有焦点的项目的父项,需要为项目模拟它。正是字节的转换,ToolStrip 期望基于窗口的控件具有可靠的 Focus 属性。

麻烦的是,您的自定义主机没有。具有焦点的是内部控制。这可以说是由于 ToolStripControlHost 类中的一个遗漏。大概。模拟窗口的麻烦,永远没有足够的代码:)

Anyhoo,通过将这段代码添加到您的主机来解决您的问题:

public override bool Focused {
    get { return _textBox.Focused; }
}
于 2014-07-13T12:04:59.723 回答