2011-01-06 6 views
3

Я работаю над настраиваемым элементом управления, который внутренне использует ComboBox.C# WPF - ComboBox

Моя проблема в том, что ComboBox сфокусирован и имеет раскрывающийся список, он, похоже, фокусирует весь элемент управления. Я хотел бы автоматически выделить первый элемент в потоке, но сейчас вам нужно нажать клавишу «Вниз», чтобы сделать это.

Есть ли способ программно выделить первый элемент в ComboBox (установите для свойства readonly IsHighlighted значение true)? Я считаю, что концепция IsHighlight внутри ComboBox отличается от концепции Focus. Кроме того, я привязываюсь через ItemsSource, поэтому у меня нет ссылки на ComboBoxItems.

+0

Итак, вы хотите, чтобы первый элемент был выделен вместо выбранного элемента? – Stefan

+0

На данный момент на данный момент нет выбранного элемента. Когда ComboBox сфокусирован, а раскрывающийся список открыт, мне нужен первый компонент ComboBoxItem, чтобы вы могли использовать клавиши со стрелками вверх/вниз в раскрывающемся списке. Прямо сейчас вам нужно нажать «Вниз», пока не будет выделен первый элемент. – jonathanpeppers

+0

Ах, извините, не помню, что у combobox не нужно иметь выделенный элемент, у меня всегда есть :-) Хм, смотрел на него какое-то время, но не могу найти решение. Я попытался отправить ключевые штрихи, но даже это не сработало ... – Stefan

ответ

3

Вот как это сделать, хотя оно может не охватывать все случаи - но вы не указали слишком много деталей (например, что происходит когда элемент уже выбран? Вы все еще хотите выбрать первый элемент в списке? Код ниже будет выделять первый элемент только тогда, когда в выпадающем списке нет выбора. Чтобы всегда выбирать первый элемент, DropDownOpened событие должно быть обработано тоже).

public MainWindow() 
{ 
    InitializeComponent(); 
    combobox.ItemContainerGenerator.StatusChanged += new EventHandler(ItemContainerGenerator_StatusChanged); 
} 

void ItemContainerGenerator_StatusChanged(object sender, EventArgs e) 
{ 
    if (combobox.ItemContainerGenerator.Status == System.Windows.Controls.Primitives.GeneratorStatus.ContainersGenerated) 
    { 
     (combobox.ItemContainerGenerator.ContainerFromIndex(0) as ComboBoxItem).Focus(); 
    } 
} 

(Надеюсь, я правильно понял, и это то, что вы хотите сделать).

+0

Это работает, я храню ComboBoxItem в переменной-члене и только вызываю Focus, когда это необходимо. Только сейчас проблема заключается в том, что если вы продолжаете нажимать, ScrollViewer автоматически не прокручивается. Если я выберу этот код, ScrollViewer будет работать по назначению. – jonathanpeppers

+0

Когда вы нажимаете клавишу «вниз»? Когда раскрывающийся список открыт? Я просто сделал быстрый тест и, похоже, работает для меня, нажимая свитки без каких-либо проблем. Может быть, ваш случай более сложный, чем мой простой combobox со 100 строк в нем? –

+0

Мое дело немного сложнее, я думаю. Хотя я думаю, что, в конце концов, я это выясню с вашим решением, я отмечаю вас как ответ. – jonathanpeppers

0

Возможно, это не то, что вы ищете, но если вы установите mycombo.SelectedIndex = 0, тогда mycombo.IsDropDownOpen = True, он должен открыть его и выбрать первый элемент. Он будет выделен, но также будет полезен и в выпадающем списке. Я не уверен, что это не желаемый эффект, хотя ..

+0

Да, я не хочу, чтобы ComboBox выбирал, просто «focus»/«IsHighlight» был на первом ComboBoxItem. – jonathanpeppers

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