Подтвердить что ты не робот

Запретить прокрутку, когда мышь входит в раскрывающийся список WPF ComboBox

Когда a ComboBox имеет большое количество элементов, его выпадающее меню станет прокручиваемым. Когда пользователь вызывает этот выпадающий список и перемещает курсор мыши, чтобы ввести границы выпадающего списка снизу, выпадающий список немедленно прокручивает один или несколько элементов вниз по списку (от goobering: также происходит при выходе из границ через нижний край).

Эта прокрутка не является интуитивной, так как список не прокручивается вверх при вводе границ сверху.

Как отключить автоматическое прокручивание?

В Visual Studio это поведение можно наблюдать через раскрывающийся список участников на панели навигации редактора кода (CTRL + F2).

4b9b3361

Ответ 1

Один из способов решения этой проблемы - использовать Поведение (или, скорее, такое поведение, как Attached Property), чтобы подписаться на RequestBringIntoView событие ComboBoxItems, а затем установить RequestBringIntoViewEventArgs.Handled в true. Это также можно сделать в небольшом масштабе, используя EventSetter и codebehind.

 <Style TargetType="ComboBoxItem">                    
     <EventSetter Event="RequestBringIntoView" Handler="OnRequestBringIntoView"/>
 </Style>

private void OnRequestBringIntoView(object sender, RequestBringIntoViewEventArgs e)
{
    //Allows the keyboard to bring the items into view as expected:
    if (Keyboard.IsKeyDown(Key.Down) || Keyboard.IsKeyDown(Key.Up))
        return;            

    e.Handled = true;            
}

Edit

Я обнаружил, что вы можете получить тот же эффект, обработав событие RequestBringIntoView на ItemsPanel, а не на самих элементах. Но такой же результат:

<ComboBox.ItemsPanel>
    <ItemsPanelTemplate>
        <StackPanel RequestBringIntoView="OnRequestBringIntoView"/>
    </ItemsPanelTemplate>
</ComboBox.ItemsPanel>

Ответ 2

Из того, что я могу сказать, это, по-видимому, вызвано тем, что элементы в нижней части света "частично отображаются", где элемент усекается контейнером. Когда мышь перебирает частичный элемент, подобный этому, WPF прокручивает весь элемент для просмотра, который иногда может оставлять еще один частичный элемент внизу.

В Winforms это можно устранить, установив .IntegralHeight, но в WPF такого свойства не существует из того, что я могу сказать. Если все элементы в вашем поле со списком имеют одинаковую высоту, вы можете связать высоту списка списка со списком с кратным высоте элемента, например, отобразить 10 элементов размером 20 x 20 пикселей, установить его на 200.