2010-07-27 2 views
0

Когда список выпадает, мышь наводится над элементом в раскрывающемся списке, элемент становится подсвеченным, но выбранное значение, отображаемое в текстовом поле, не изменяется, если элемент щелчок. Я ищу способ изменить мышь на поведение в элементе управления, который наследуется от ComboBox. Я попытался доминирующую функцию как OnMouseEnter & OnMouseMove и т.д.Переопределение мыши над поведением в комбинированном поле WPF

ответ

2

Вы можете сделать это, переопределив OnMouseMove. Свойство OriginalSource MouseEventArgs предоставит вам элемент непосредственно под мышью. Вы можете использовать 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, ToggleButton со стрелкой и ListBox. Показывать список, когда установлен флажок ToggleButton. Когда пользователь нажимает над списком элементов, меняет текст в текстовом поле и обновляет некоторое свойство для выбранного элемента или запускает событие.

0

Это, как я решил такую ​​же проблему в моем коде, hopefull, что это может быть полезным для кого-то другого , или просто шаги к полному решению xaml.

Я следовал за решением Quartermeister. Но, на мой взгляд, необходимость подклассификации ComboBox - это слабость дизайна (потому что это делается только для обработки события MouseOver). Поскольку мне нужно просто для другого поведения события MouseOver, я применил только метод, который обрабатывает события MouseOver в классе, прикрепленном к файлу XAML.

Прежде всего, я использовал класс EventSetter, который подклассифицирует класс Setter и относится к событиям. Таким образом, EventSetter можно использовать для украшения FrameworkElements, как мы обычно делаем с Setter.

<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 по причинам, которые не стоит объяснять здесь, Я не мог использовать это поведение.

Смежные вопросы