2014-07-07 20 views
2

我遇到了一些奇怪的行爲。讓我試着解釋一下,我將代碼剝離到最低限度,但仍然存在問題。所以首先,我在.NET 4.0中使用VS2013,而在Windows 8.1上。帶自定義ToolStripControlHost的ToolStrip使得Tab鍵順序對焦怪異

所以我有一個自定義UserControl與同時正在通過ToolStripControlHost使用TextBox,如果我專注於這個文本框和命中TAB,它只週期通過控制這個文本框的左側。如果我有它的重點和點擊SHIFT + TAB,它循環通過右邊的按鈕。

enter image description here

所以這是我的表格的一個例子。中間的文本框是一個自定義控件。我的代碼(如簡化地)是這樣的:

[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中添加一個按鈕,我的自定義控制,另一個按鈕(通過設計師的我怎麼一直在做)
  5. 運行

一旦運行...

  1. 焦點在自定義控制
  2. 命中TAB幾次,它應該只專注於左側的控件。
  3. 點擊SHIFT + TAB幾次,它只會集中在右側。

有誰知道問題是什麼 - 或者我該如何解決這個問題?我一整天都在試圖解決這個問題。我終於剝離了我的代碼,我似乎無法使其工作。我甚至試圖覆蓋大部分的功能並自己做,但這成了一場噩夢。

謝謝!

更新1:所以一些額外的tid-bits。

如果我將自定義控件更改爲從TextBox而不是UserControl繼承,則tabbing/focus按預期工作。

如果我改變它是一個Control代替UserControl互聯工作正常,爲好,但重點絕不是我的內心文本框內獲得 - 焦點似乎丟失(或可能在外部母公司控制,但不被傳遞到內部TextBox)。

我看到添加了一個MS Connect項目,該項目從2009年開始描述這個問題,但如果我沒有登錄到Microsoft Connect,此鏈接似乎工作。這意味着,我不能對它投票或評論... http://connect.microsoft.com/VisualStudio/feedback/details/472592/tab-cycling-through-controls-with-usercontrol-on-toolstrip-doesnt-perform-as-expected

回答

3

.NET 2.0 ToolStripItem類一直是一個主要的錯誤工廠。它們是無窗口控件,但是重現確切的 Windows窗口的行爲並不那麼容易。下面有大量的代碼,其中大部分是內部的,所以你無法修補它。當他們沒有完美地模仿窗戶的行爲時就會出現怪癖。你可以將它們稱爲「空域」問題,這與WPF的問題非常相似。

此處的空域問題是重點,對於真正的窗口完全無歧義,但它需要僞造爲ToolStripItem。它實際上是具有焦點的項目的父項,它需要針對該項目進行模擬。這是字節的過渡,ToolStrip希望基於窗口的控件具有可靠的Focus屬性。

問題是,您的自定義主機沒有。這是關注焦點的內部控制。這可以被歸咎於ToolStripControlHost類中的遺漏。大概。與模擬窗口的麻煩,從未有足夠的代碼:)

安美居,加入的代碼這條到你的主機解決您的問題:

public override bool Focused { 
    get { return _textBox.Focused; } 
} 
+0

哇,我花了好幾天這方面的工作。我嘗試覆蓋我的ToolStrip控件和'UserControl'父項上的'OnGotFocus'和'OnLostFocus'的每個組合,以將焦點傳遞給子控件。甚至嘗試通過在referencesource.microsoft.com上結合一些來自.NET源代碼的組件來構建自己的複合控件。它最終被固定在這一行(ok 3行)。感謝漢斯,這正是我期待的 - 而且比我預期的要簡單得多! –

+0

必須等待13個小時才能獲得賞金,但這是你的兄弟! –