2010-07-27 57 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 对于那些不值得在这里解释的原因,我无法使用这种行为。