2011-08-22 26 views
1

當我在WPf DropDown組合框中選擇了一個值項時,使用鍵導航左右箭頭鍵會導致爲每個項目選擇更改的事件。在導航通過箭頭鍵時禁用WPF下拉組合的onSelectedIndex已更改事件

如何解決這個問題

+1

我知道的一種方法是編輯一個包含ContentPresenter的模板,並將其應用於1'EventSetter' - 'PreviewKeyDown'的樣式,並在其中製作一些技巧,比如'e.Handled = true '或者類似的東西。 – stukselbax

回答

2

最容易且適當的方式適當的方法,我發現解決這個問題如下:

,而不是使用SelectedIndexChanged事件我用DropDownClosed事件以及在選定索引內更早被更改的所有代碼都會在檢查項目是否被選中的if條件下移至此事件。喜歡這個。當我通過箭頭鍵SelectedIndexChagned事件將不會觸發導航或因爲我沒有使用過該事件,因此它不會產生任何問題

private void OnCmbOperatorsListDropDownClosed(object sender, EventArgs e) 
     { 
      if (cmbOperatorsList.SelectedIndex != -1) 
       InsertText(cmbOperatorsList.SelectedValue.ToString()); 
       //Do whatever u want with selected item 
     } 

所以在這種方式。

1

據我所知,這是不可能的馬上。我可以用一種「選擇模擬」的方式實現這一點。

  1. 上組合框下拉把手箭頭鍵在PreviewKeyDown事件通過設置e.Handled = true。所以通常的基於導航的選擇不會發生。

  2. 基於Keys的Inthese處理程序,從下拉列表中更改上一個或下一個項目的BackgroundForeground,以便它看起來好像選中並突出顯示。

  3. 然後在下拉菜單關閉時執行該項目的選擇,該項目當然具有「模擬選擇背景 - 前景」。關閉下拉菜單後,還原背景和前景樣式。

但這就是我的方式。

1

可以使用PreviewKeyDown事件像

私人無效combo_PreviewKeyDown(對象發件人,發送KeyEventArgs E) {

 if (e.Key.Equals(Key.Left) || (e.Key.Equals(Key.Right))) 
     {     
      ((ComboBox)sender).SelectionChanged -= combo_SelectionChanged; 

     }   
    } 

,如果ü要附上事件中,你可以添加此PreviewMouseDown事件。
這是我試過,也有可能做這樣的情況下