C# WPF - 组合框

Posted

技术标签:

【中文标题】C# WPF - 组合框【英文标题】:C# WPF - ComboBox 【发布时间】:2011-01-06 16:43:50 【问题描述】:

我正在开发一个内部使用 ComboBox 的自定义控件。

我的问题是当 ComboBox 聚焦并打开下拉菜单时,它似乎聚焦整个控件。我想自动突出显示下拉列表中的第一项,但现在您必须按下向下键才能这样做。

有没有办法以编程方式突出显示 ComboBox 中的第一项(将只读 IsHighlighted 属性设置为 true)?我相信组合框中的 IsHighlight 概念与焦点不同。另外,我是通过 ItemsSource 绑定的,所以我没有引用 ComboBoxItems。

【问题讨论】:

所以你想突出显示第一个项目而不是选定的项目? 此时没有选中的项目。当 ComboBox 聚焦并打开下拉菜单时,我需要突出显示第一个 ComboBoxItem,以便您可以使用下拉菜单中的向上/向下箭头键。现在你必须在第一个项目被突出显示之前点击 Down。 啊抱歉不记得组合框不需要选择项,我一直有:-) 嗯,看了一段时间,但找不到解决方案。我尝试发送击键,但即使这样也没有用... 是的,发送 Down 按键会做一些疯狂的事情,似乎会破坏 ComboBox 的 IsHighlight 逻辑。我要试试@Andrei 的回答。 【参考方案1】:

这是一种方法,虽然它可能无法涵盖所有​​情况 - 但您没有提供太多细节(例如,当已经选择了一个元素时会发生什么?您还想选择第一个列表中的元素?下面的代码仅在组合框中没有选择时才会突出显示第一个元素。要使其始终选择第一个元素,还应处理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 会按预期工作。 你到底什么时候按下向下键?什么时候打开下拉列表?我刚刚做了一个快速测试,它似乎对我有用,按下滚动条没有任何问题。也许您的案例比我的包含 100 个字符串的简单组合框更复杂? 我的情况有点复杂,我猜。虽然我认为我最终会用你的解决方案解决这个问题,但我将你标记为答案。 在我的最终解决方案中,我使用您的方法来抓取生成的 ComboBoxItem,然后手动引发 MouseEnter 事件以使其工作。调用 Focus() 导致我的情况出现问题。【参考方案2】:

它可能不是你要找的,但如果你设置 mycombo.SelectedIndex = 0 那么 mycombo.IsDropDownOpen = True 它应该打开它并选择第一个项目。它将突出显示,但也将是组合框中的值。我不确定这是否不是预期的效果..

【讨论】:

是的,我不想选择 ComboBox,只是将“focus”/“IsHighlight”放在第一个 ComboBoxItem 上。

以上是关于C# WPF - 组合框的主要内容,如果未能解决你的问题,请参考以下文章

ItemsControl 组合框 selecteditem C# WPF MVVM

在 WPF / C# 中选择绑定项目后维护组合框文本

在wpf中访问数据网格内的组合框属性

WPF 组合框禁用背景颜色

从C#中的WPF组合框或文本框获取文本

如何在 WPF 中隐藏组合框的项目