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

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

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

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

【问题讨论】:

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

标签: c# .net wpf combobox itemssource


【解决方案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 上。
猜你喜欢
  • 2021-09-16
  • 2013-01-12
  • 2015-08-22
  • 2015-04-27
  • 2019-01-20
  • 1970-01-01
  • 2021-10-15
  • 2014-02-03
  • 2011-08-25
相关资源
最近更新 更多