C# WPF - ComboBox

3
我正在开发一个自定义控件,内部使用了ComboBox。
我的问题是当ComboBox获得焦点并且下拉菜单打开时,它似乎会将整个控件聚焦。我想自动突出显示下拉菜单中的第一项,但现在必须按下“向下”键才能实现。
有没有一种编程方法可以突出显示ComboBox中的第一项(将只读IsHighlighted属性设置为true)?我认为ComboBox中的IsHighlight概念与Focus不同。此外,我通过ItemsSource绑定,因此无法引用ComboBoxItems。

所以你希望将第一项突出显示而不是选择的项目? - user348905
此时没有选定项目。当 ComboBox 获得焦点并且下拉列表打开时,我需要将第一个 ComboBoxItem 高亮显示,以便您可以在下拉列表中使用向上/向下箭头键。目前,您必须先按“向下”键才能突出显示第一项。 - jonathanpeppers
啊,抱歉我没记住组合框不需要有选定项,我总是这样 :-) 嗯,已经看了一会儿了,但找不到解决方案。我尝试发送按键,但甚至那也不起作用... - user348905
是的,发送一个“向下”键按下操作会导致一些疯狂的事情发生,似乎会破坏ComboBox的IsHighlight逻辑。我将尝试@Andrei的解答。 - jonathanpeppers
2个回答

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();
    }
}

(希望我理解正确,您想要做的是这样) 。

这个方法可行,我将ComboBoxItem存储在成员变量中,并在适当的时候调用Focus。现在唯一的问题是,如果你不停地按下去,ScrollViewer不会自动滚动。如果我把这段代码拿掉,ScrollViewer就能正常工作了。 - jonathanpeppers
你是在什么时候按下向下键的?是在下拉列表打开的时候吗?我刚做了一个快速测试,它对我来说似乎可以正常滚动。也许你的情况比我的简单组合框中的100个字符串更复杂? - Andrei Pana
我的情况可能会更加复杂,但我相信最终能够通过你的解决方案来搞定它,因此我将把你标记为答案。 - jonathanpeppers
在我的最终解决方案中,我使用了您的方法来获取生成的ComboBoxItem,然后手动触发MouseEnter事件使其正常工作。在我的情况下,调用Focus()会引起问题。 - jonathanpeppers

0

这可能不是你想要的,但如果你设置 mycombo.SelectedIndex = 0 然后 mycombo.IsDropDownOpen = True,它应该打开并选择第一项。它将被突出显示,但也将是组合框中的值。虽然我不确定这是否是所期望的效果。


是的,我不想让ComboBox被选中,只想让第一个ComboBoxItem获得“焦点”/“高亮”。 - jonathanpeppers

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接