2011-04-14 48 views
4

我曾嘗試過這幾個小時,但它不工作。如何在WPF組合框項目被點擊或通過回車鍵選擇時捕獲事件?

我有一個組合框,有幾個項目在那裏,像一個搜索框一樣動態生成。

現在我想捕捉一個事件,當用戶點擊下拉菜單項時,或者點擊下拉菜單項。

如何實現這一目標?我試圖在Combobox上設置鼠標/鍵盤事件處理程序,但它只適用於組合框的文本框,而不是在下拉列表中。

謝謝。

編輯: 我忘了提及我在我的Combobox上定製了DataTemplate。我嘗試了另一種在ComboBox.ItemContainerStyle中設置事件的方法。

我試過PreviewKeyDown,但沒有捕獲。任何想法?的

回答

5

代替使用MouseLeftButtonDown事件, 使用PreviewMouseLeftButtonDown事件

WPF支持「事件冒泡」的概念,使得當一事件被觸發,它冒泡的一個更高的元件上實現該事件的樹。 但ComboBox本身已經實現了點擊事件。所以你必須告訴它泡沫「下」。

+0

感謝後,我忘了提,我有我的組合框自定義的DataTemplate。我嘗試了另一種在ComboBox.ItemContainerStyle中設置事件的方法。 <形式的TargetType = 「{x:類型ComboBoxItem}」> 我試圖PreviewKeyDown,但沒有被捕獲。任何想法? – VHanded 2011-04-14 07:03:43

5

我認爲你正在尋找的是「SelectionChanged」事件。只要您通過鼠標點擊或使用箭頭鍵導航並點擊「Enter」(我嘗試成功),在下拉列表中選擇一個項目後立即引發此事件。

 <ComboBox x:Name="cbobox" ItemsSource="{Binding SourceList}" 
       SelectionChanged="cbobox_SelectionChanged"> 
     <ComboBox.ItemContainerStyle> 
      <Style TargetType="{x:Type ComboBoxItem}"> 
       <Setter Property="Template" > 
        <Setter.Value> 
         <ControlTemplate> 
          <TextBlock Text="{Binding BusinessProperty}"/> 
         </ControlTemplate> 
        </Setter.Value> 
       </Setter> 
      </Style> 
     </ComboBox.ItemContainerStyle> 
    </ComboBox> 
+0

我知道如果我用鼠標或鍵盤向上/向下鍵向上或向下移動,choosechanged將會觸發,但是當我按下「Enter」時,我需要另一個事件觸發。 我有一個解決方案,使用selectionChanged將當前選定的ComboBoxItem複製到全局ComboBoxItem,然後使用combobox_PreviewKeyUp捕獲Enter鍵,並處理globalComboBox項目。不優雅,但是我目前的解決方案,它的工作 – VHanded 2011-04-14 08:08:54

0

如果您正在使用您的ComboBoxItem一個自定義的控件模板,它可能是與ContentPresenter的Horizo​​ntalContentAlignment問題。這裏是我的老控件模板的樣子,當我遇到的問題:

<ControlTemplate TargetType="{x:Type ComboBoxItem}"> 
    .... 
    <ContentPresenter 
     HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" 
     SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" 
     VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/> 

這裏是怎麼看了之後我解決了這一問題:

<ControlTemplate TargetType="{x:Type ComboBoxItem}"> 
    .... 
    <ContentPresenter 
     HorizontalAlignment="Stretch" 
     SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" 
     VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/> 

或者,你可以獨自離開的ControlTemplate和爲每個ComboBoxItem設置Horizo​​ntalContentAlignment。不過,我覺得人們不應該這樣做,以使我的ComboBoxItem ControlTemplate工作。

1

我也試了幾個小時,這裏是我的解決方案: 訂閱KeyUp事件。

不知何故,這是唯一被觸發的事件,可用於區分使用自定義模板的鼠標和鍵盤選擇。

public override void OnApplyTemplate() 
{ 
     base.OnApplyTemplate(); 
     KeyUp += OnKeyUp; 
} 

void OnKeyUp(object sender, KeyEventArgs e) 
{ 
     if (e.Key == Key.Down) 
     {...} 
     else if (e.Key == Key.Up) 
     {...} 
     else if(e.Key == Key.Enter) 
     {...} 
} 

希望這也適用於你。

0

一個星期我結束了這個

<StackPanel> 
      <ComboBox Name="cmb" ItemsSource="{Binding Items}" 
          SelectedValue="{Binding SelectedVale}"> 
       <ComboBox.ItemTemplate> 
        <DataTemplate> 
         <StackPanel Orientation="Horizontal"> 
          <Button Content="{Binding DisplayText}" Command="{Binding ItemClick}" Style="{StaticResource {x:Static ToolBar.ButtonStyleKey}}"></Button> 
         </StackPanel> 
        </DataTemplate> 

       </ComboBox.ItemTemplate> 
      </ComboBox> 
     </StackPanel> 
相關問題