2011-02-16 53 views
2

我想創建自定義控件,它看起來像標準的WPF ComboBox,但不是彈出窗口中會有ItemsPresenter,而會有另一個自定義控件。所以,我創建了從0​​派生新類,增加了一個IsDropDownOpen財產,創造一種風格,其實是默認ComboBox風格複印件(主要思想是,Popup.IsOpenToggleButton.IsPressed屬性綁定到該控件的IsDropDownOpen屬性)。WPF類似combobox的自定義控件

問題是,當我單擊控件外部時,Popup未關閉。

我看了看Reflector中的ComboBox類,發現ComboBox在丟失鼠標捕獲時使用了一些邏輯來更新IsDropDownOpen屬性。但是該代碼使用了一些內部類。有沒有其他方法可以確定用戶是否在控制之外單擊並關閉了Popup

UPD:我沒有找到附加文件發佈的方式,所以我上傳示例項目here

有看起來像組合框自定義控制,但它有一個彈出一個TreeView。當您打開彈出窗口並在控件外部單擊時,它會自動關閉,但如果您打開彈出窗口,請展開'Item2',然後在彈出窗口外部單擊關閉。問題是如何解決這個問題?

+0

你可以張貼一些代碼? – RQDQ 2011-02-16 15:02:39

+0

@RQDQ:你到底需要什麼?控制模板?正如我所說,它與默認的組合框模板相同,但不是ItemsPresenter還有另一個控件。 – adogg 2011-02-17 07:21:13

+0

這個想法是我們想看看你已經有了什麼,所以我們不必重新發明輪子來幫助你。 – RQDQ 2011-02-17 14:09:54

回答

0

這段代碼解決了這個問題。

在靜態構造器:

EventManager.RegisterClassHandler(typeof(CustomComboBox), Mouse.LostMouseCaptureEvent, new MouseEventHandler(OnMouseCaptureLost)); 

事件處理程序實現:

private void OnMouseCaptureLost(object sender, MouseEventArgs e) 
{ 
    if (Mouse.Captured != _container) 
    { 
     if (e.OriginalSource != _container) 
     { 
     Mouse.Capture(_container, CaptureMode.SubTree); 
     e.Handled = true; 
     } 
    } 
} 
0

Control.LostFocus事件,也許處理這就足夠了。