【问题标题】:Detect if mouse click hits a item not in listbox [C#]检测鼠标单击是否命中不在列表框中的项目[C#]
【发布时间】:2011-08-03 05:34:19
【问题描述】:

如果用户单击列表框中的项目,则调用 listboxItems_SelectedIndexChanged。但是,即使用户错过了一个项目并在列表框内(而不是项目上)随机单击,仍然会调用 listboxItems_SelectedIndexChanged。

我该如何改变呢?我只想对项目点击采取行动。

注意:删除使用键盘导航应用程序的功能不是一种选择。

【问题讨论】:

  • Winforms?如果有,请添加标签
  • @Merlyn,因为我使用的是列表框,所以应该很明显。
  • 不一定 - WPF 也有一个 ListBox 控件。在我看到梅林的评论之前,我实际上是要回答你的问题。

标签: c# winforms listbox


【解决方案1】:

也许 SelectedIndexChanged 不是放置逻辑的正确位置,因为即使您使用键盘更改选择也会触发它。 我会改用 MouseClick,检查单击是否发生在所选项目上,即类似这样的内容:

    private void listBox1_MouseClick(object sender, MouseEventArgs e)
    {
        if (listBox1.SelectedIndex < 0 || !listBox1.GetItemRectangle(listBox1.SelectedIndex).Contains(e.Location))
            MessageBox.Show("no click");
        else
            MessageBox.Show("click on item " + listBox1.SelectedIndex.ToString());
    }

【讨论】:

  • 不能删除键盘导航。
  • 不清楚,因为您写道:“我只想对项目点击采取行动”。在这种情况下,我认为 tzup 为您指明了前进的方向。
【解决方案2】:

我猜在某些情况下,您的控件中没有足够的列表项,因此您有一些可以单击的空间,然后 SelectedIndexChanged 被触发。

我猜您不能动态调整控件的大小以始终适合列表项的数量,否则您不会问这个问题。

现在,当用户单击(选择)同一个列表项时会发生什么?即使选择的索引相同,是否应该发生一些逻辑(所以当第一次单击它时发生相同的逻辑)?

如果您需要忽略多次选择相同的索引,那么您可以使用以下技巧:

在表单范围内保留一个变量(包含列表框控件的表单),每次选择索引更改时都会设置该变量。然后稍后使用它来检查是否已做出相同的选择以忽略处理事件。这是一个例子:

 private int _currSelIdx = -1; // Default value for the selected index when no selection
 private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
 {
      if (listBox1.SelectedIndex == _currSelIdx)
         return;

      Console.WriteLine(listBox1.SelectedIndex);
      _currSelIdx = listBox1.SelectedIndex;
 }

它不是很漂亮,但是嘿...不管用什么!

【讨论】:

    【解决方案3】:

    此链接可能有助于实现与单击相同的操作,而不是双击

    i want to detect an item double click in a winforms listbox control. [how to handle click on blank area?]

    【讨论】:

    • 这不适用于键盘导航,因此不能很好地回答我的问题。
    猜你喜欢
    • 2014-10-10
    • 1970-01-01
    • 2019-01-16
    • 2010-10-05
    • 2011-11-25
    • 2013-05-11
    • 1970-01-01
    • 2014-12-26
    • 1970-01-01
    相关资源
    最近更新 更多