2010-07-27 25 views
0

當列表被放下時,鼠標懸停在下拉列表中的某個項目上,項目將突出顯示,但文本框中顯示的選定值不會更改,除非項目被點擊。我正在尋找一種方法來修改從ComboBox繼承的控件上的鼠標移動行爲。我嘗試覆蓋功能,如OnMouseEnter & OnMouseMove覆蓋WPF組合框中的鼠標移動行爲

回答

2

你可以通過覆蓋OnMouseMove來完成。 MouseEventArgs的OriginalSource屬性將爲您提供直接在鼠標下面的元素。您可以使用ContainerFromElement獲取包含該元素的ComboBoxItem然後ItemContainerGenerator.ItemFromContainer拿到項目選擇:

protected override void OnMouseMove(MouseEventArgs e) 
{ 
    base.OnMouseMove(e); 
    var container = ContainerFromElement((DependencyObject)e.OriginalSource); 
    if (container != null) 
    { 
     SelectedItem = ItemContainerGenerator.ItemFromContainer(container); 
    } 
} 
0

而是使用TextBlock,具有箭頭和ListBox的切換按鈕創建自己的控件。當ToggleButton被選中時顯示列表框。當用戶將鼠標放在listboxitem上時,更改文本框中的文本並更新所選項目的某些屬性或激發一個事件。

0

這是我如何解決同樣的問題,在我的代碼,厚福,這可能是有用的爲別人,或者只是邁向完整的xaml解決方案。

我遵循Quartermeister的解決方案。但在我看來,需要繼承ComboBox是一個設計弱點(因爲這只是爲了處理MouseOver事件)。因爲我只需要處理MouseOver事件的不同行爲,所以我只實現了處理連接到XAML文件的類中的MouseOver事件的方法。

首先,我使用了EventSetter類,它是Setter類的子類,它特定於Events。所以EventSetter可以像我們通常用Setter一樣來裝飾FrameworkElements。

<ComboBox> 
    <ComboBox.ItemContainerStyle> 
     <Style TargetType="{x:Type ComboBoxItem}"> 
      <EventSetter Event="MouseMove" Handler="_updateModel"/> 
     </Style> 
    </ComboBox.ItemContainerStyle> 
</ComboBox> 

通過這種方式,當鼠標懸停它時,每個ComboBoxItem都會調用_updateModel。

我_updateModel的實施是相當直接,它是基於強烈的Quartermeister的工作:

private void _updateModel(object sender, MouseEventArgs e) 
{ 
    DependencyObject src = e.Source as DependencyObject; 
    ComboBoxItem cbi = VisualTreeHelper.GetParent(src) as ComboBoxItem; 
    while ((cbi == null) && (src!=null)) 
    { 
     src = VisualTreeHelper.GetParent(src); 
     cbi = src as ComboBoxItem; 
    } 
    if (cbi != null) 
    { 
     ComboBox cb = ItemsControl.ItemsControlFromItemContainer(cbi) as ComboBox; 
     if (cb != null) 
     { 
      var container = cb.ContainerFromElement((DependencyObject)e.OriginalSource); 
      if (container != null) 
      { 
       cb.SelectedItem = cb.ItemContainerGenerator.ItemFromContainer(container); 
      } 
     } 
    } 
} 

其他方法來解決同樣的問題可以用blend's behaviors 對於那些不值得在這裏解釋的原因,我無法使用這種行爲。