Переопределение поведения мыши в поле со списком WPF - PullRequest
0 голосов
/ 28 июля 2010

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

Ответы [ 3 ]

2 голосов
/ 30 июля 2010

Вы можете сделать это, переопределив 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 голосов
/ 11 апреля 2012

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

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

0 голосов
/ 28 июля 2010

Вместо этого создайте свой собственный элемент управления, используя TextBlock, ToggleButton со стрелкой и ListBox. Показать список, когда отмечена кнопка ToggleButton. Когда пользователь наведет курсор мыши на элемент списка, измените текст в текстовом поле и обновите какое-либо свойство для выбранного элемента или запустите событие.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...