【问题标题】:WPF - Removing Hover State when using keyboard inside a ComboBoxWPF - 在组合框中使用键盘时删除悬停状态
【发布时间】:2016-11-03 22:22:20
【问题描述】:

当用户使用键盘箭头浏览项目时,我正在尝试删除用户在ComboBoxItem 上可能具有的悬停状态。但是,当用户将鼠标移到某个项目上时,悬停状态/选择状态会转到该项目。

现在,使用股票 WPF ComboBox,我发现有三种不同组合的状态:聚焦、悬停、选中。例如,在下面的截图中,item3 是被选中的那个,item5 是鼠标悬停状态,item7 是键盘焦点。

我希望我的 ComboBox 的行为是这样的

<!DOCTYPE html>
 <html>
    <body>
      <select>
        <option value="Item1">Item #1</option>
        <option value="Item2">Item #2</option>
        <option value="Item3">Item #3</option>
        <option value="Item4">Item #4</option>
     </select>
   </body>
 </html>
  • 当我进入下拉菜单时,“已选择”(在本例中为蓝色)值已被选中。
  • 如果我将鼠标悬停在某个项目上,该项目将成为“选中”的项目。
  • 从那里开始,如果我使用键盘上的箭头,“选定”项目会发生变化,并且在我再次移动鼠标之前没有任何项目处于悬停状态。

我尝试在 Selected 和 MouseOver 状态上使用 VisualStatesTrigger,但它似乎不起作用。我还检查了,它可以用EventSetters 完成,但我不知道在哪个Event 上附加处理程序以检测ComboBoxItem 顶部的鼠标移动。

提前感谢您的帮助!

【问题讨论】:

  • 在您的 HTML 示例中,悬停实际上不会选择元素,因为组合框本身的值不会更新。
  • 你是对的。该值未选中,但如果我单击它或按 Enter 键,它将显示为将被选中的值。这将是我想要的行为。

标签: c# wpf xaml combobox


【解决方案1】:

我不确定这是否是您的目标,但请尝试一下,看看是否是您想要的:

<ComboBox Height="50" Width="100" HorizontalAlignment="Left" VerticalAlignment="Top"
              IsEditable="False">
        <ComboBox.Resources>
            <Style TargetType="ComboBoxItem">
                <Setter Property="IsSelected" Value="{Binding RelativeSource={RelativeSource Self}, Path=IsFocused, Mode=OneWay}"/>
            </Style>
        </ComboBox.Resources>
        <ComboBoxItem Content="Items 1" />
        <ComboBoxItem Content="Items 2" />
        <ComboBoxItem Content="Items 3" />
        <ComboBoxItem Content="Items 4" />
    </ComboBox>

您可以将 Combobox 绑定到 ItemsSource,这与 ComboboxItems 的来源无关。

【讨论】:

  • 这在某种程度上有所帮助。但是通过绑定到选定的元素,如果我悬停,这个元素将被选中,如果我点击组合框,即使我没有选择任何一个,这个元素也会被选中。
  • 所以您实际上是在寻找 ComboBoxItem 的 IsHighlighted 属性。使用键盘时,应将其设置为 True。问题是您不能这样做,如果您的目标是框架 > 3.0(请参阅url 您可以做的是制作自定义突出显示机制,而不是 Combobox 提供的机制。我可以针对此建议发布解决方案如果你愿意。
  • 我不会拒绝 IsHighlighted 属性的答案。我也发现了一些东西,但也许你的更好!
【解决方案2】:

我找到了一种使用简单 EventSetter 的方法。

<EventSetter Event="MouseMove" Handler="ComboBoxItemStyle_OnMouseMove" />

此事件设置器直接应用于我的ComboBoxItem 的样式。这是这个事件处理程序的代码:

private void ComboBoxItemStyle_OnMouseMove(object sender, MouseEventArgs e)
{
    var hoveredItem = sender as ComboBoxItem;
    hoveredItem?.Focus();
}

我的ComboBoxItem 还具有OverrideDefaultStyleTrue 的属性,因此我可以设置ComboBoxItems 在悬停、聚焦和选择时的显示方式。为了做到这一点,我决定在项目的模板上使用 VisualStates。

当一个项目处于Focused 状态时,我将Background 设置为我想要的颜色,并且与Foreground 相同。我也对Selected 状态做了同样的事情。因为,MouseMove 事件将当前悬停的项目设置为焦点,所以状态开始并相应地设置样式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-18
    • 1970-01-01
    • 2014-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多