2012-12-17 76 views
2

我有一個ToolStripDropDownButton一個ToolStrip的。這反過來用一個DateTimePicker彈出一個UserControl。當我點擊日曆上的頂部數字(綠色)時,一切正常(用戶控制保持打開狀態)。當我點擊其中一個較低的日期(紅色)時,ToolStripDropDown關閉,應用程序失去焦點。這會導致用戶必須雙擊才能再次打開DropDown(一次關注應用程序,另一次打開下拉菜單)。工具條(ToolStripDropDownButton)關閉而失去窗口焦點

這種情況發生時壓延日期不在用戶控件的頂部。如您所見,用戶控件在「綠色」日期停止。

我希望這很清楚。這似乎是一個Windows錯誤,因爲這發生在一個非常簡單的項目。有沒有人注意到這個問題?有沒有解決這個問題?

enter image description here

[更新]

我注意到有下拉同樣的事情。

enter image description here

它不與用戶控制發生的事情是非常大的。

enter image description here

Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load 

    Dim uc As New UserControl1 
    Dim cms As New ContextMenuStrip() 
    cms.Items.Add(New ToolStripControlHost(uc)) 
    ToolStripButton1.DropDown = cms 

End Sub 

回答

2

功能,不是一個錯誤。控件需要知道用戶在下拉菜單之外單擊,以便它可以自動關閉下拉菜單。這是通過「捕獲」屬性在Winforms中公開的「鼠標捕獲」完成的。即使鼠標不再位於控制窗口內,捕獲鼠標也可確保將鼠標消息發送到控件。

也許是顯而易見的,現在發生了什麼,你是不是其實點擊日曆。一旦顯示下拉菜單,控制器就會捕獲鼠標。點擊被重定向到ToolStripDropDown。當你點擊「紅色區域」並因此關閉下拉窗口時,鼠標不再處於下拉菜單內。

下拉框這樣的,實際上只適用於簡單的項目,把任何控制它創建一個頂層窗口,像的DateTimePicker或ComboBox僅僅是不支持的場景裏面。

+0

而不是ToolStripDropDownButton,有沒有其他的控件可以給我類似的東西? (從菜單項打開自定義控件) –

+0

表單將是合乎邏輯的選擇。 –

1

我不能改變應用程序的行爲,所以我決定到窗體的自動關閉設置爲False或True取決於控件的事件。

1

我在通過切換自動關閉以類似的方式解決了這個。以爲我會張貼代碼:

public class ToolStripDropDownDateTimePicker : DateTimePicker 
{ 
    private bool savedAutoClose; 

    /// <summary> 
    /// Creates a new ToolStripDropDownDateTimePicker. 
    /// </summary> 
    public ToolStripDropDownDateTimePicker() 
    { 

    } 

    protected override void OnCloseUp(EventArgs e) 
    { 
     if (this.Parent != null) 
     { 
      var dropDownHost = this.Parent.Parent as ToolStripDropDown; // recursive instead? 
      if (dropDownHost != null) 
       dropDownHost.AutoClose = savedAutoClose; // restore the parent's AutoClose preference 
     } 

     base.OnCloseUp(e); 
    } 

    protected override void OnDropDown(EventArgs e) 
    { 
     if (this.Parent != null) 
     { 
      var dropDownHost = this.Parent.Parent as ToolStripDropDown; // recursive instead? 
      if (dropDownHost != null) 
      { 
       savedAutoClose = dropDownHost.AutoClose; 
       // ensure that our parent doesn't close while the calendar is open 
       dropDownHost.AutoClose = false; 
      } 
     } 
     base.OnDropDown(e); 
    } 
}