【问题标题】:WPF: ListBox unselectingWPF:列表框取消选择
【发布时间】:2010-01-27 17:25:13
【问题描述】:
  1. 当用户单击我的单选ListBox 中的某个项目时,该项目被选中。
  2. 当用户第二次单击某个项目时,除非他们按住控制键,否则该项目不会被取消选择。

将 #2 更改为不需要控制键的推荐方法是什么?

【问题讨论】:

    标签: wpf select listbox


    【解决方案1】:

    确保选择模式为Multiple。通过选择多个:

    您只需单击鼠标即可使用鼠标选择和取消选择您想要的任何项目。但是,如果您一次只需要一个选定的项目,则必须在 SelectionChanged 事件中取消选择代码中的其他项目。

    Source

    Private Sub MainList_SelectionChanged(ByVal sender As System.Object, ByVal e As System.Windows.Controls.SelectionChangedEventArgs)
        If e.AddedItems.Count > 0 Then
            Dim valid = e.AddedItems(0)
            For Each item In New ArrayList(MainList.SelectedItems)
                If item IsNot valid Then MainList.SelectedItems.Remove(item)
            Next
        End If
    End Sub
    

    【讨论】:

      【解决方案2】:

      抱歉,这个话题复活了……

      但是接受的答案并不能很好地满足我的所有需求,所以我对其进行了一些改进。我有几十个ListBox,它们都需要这种点击时取消选择行为。

      因此,我创建了一个自定义控件,覆盖SelectionModeProperty(将其默认值设置为SelectionMode.Multiple)并自动跟踪SelectionChanged 事件。让我们显示代码:

      public class UnselectableListBox : ListBox
      {
          public UnselectableListBox() : base()
          {
              SelectionChanged += new SelectionChangedEventHandler((sender, e) =>
              {
                  if (e.AddedItems.Count > 0)
                  {
                      var last = e.AddedItems[0];
                      foreach (var item in new ArrayList(SelectedItems))
                          if (item != last) SelectedItems.Remove(item);
                  }
              });
          }
      
          static UnselectableListBox()
          {
              SelectionModeProperty.OverrideMetadata(typeof(UnselectableListBox),
                  new FrameworkPropertyMetadata(SelectionMode.Multiple));
          }
      }
      

      然后,我只需要将我的 XAML 替换为:

      <local:UnselectableListBox ... />
      

      不再需要在每个Window 上为每个ListBox 编码SelectionChanged

      【讨论】:

        【解决方案3】:

        不想打败死马,但我遇到了同样的问题,无法使用此处答案中使用的任何方法...希望有人能从我的回答中受益:

        我将选择模式设置为单一。我有双击事件,这使得多选模式不太理想,并且很难让双击工作。

        SelectionChanged 仅在所选项目不同时触发。简单的方法:使用PreviewLeftMouseDownClickPreviewLeftMouseUpClick。将MyListBox.SelectedIndex 存储到预览鼠标按下事件中的对象变量中。

        在预览鼠标向上事件中,将向下事件中的变量与MyListBox.SelectedIndex 进行比较,如果它们相同,则设置MyListBox.SelectedIndex = -1

        如果相同,则取消选择该项目,因为索引号的更改发生在预览向下和向上预览之前!

        【讨论】:

          【解决方案4】:

          使用控制键推荐的方式来做到这一点。这是一个 UI 手势,在所有 Windows 中都是一致的。你应该警惕改变这种行为。

          【讨论】:

          • 通常我会同意,但对于我目前的设计而言,能够轻松取消选择项目非常重要。
          • P.S.我担心的一个问题是我想要只用鼠标控制。如果将其放在触摸屏上,将没有可用的键盘。
          【解决方案5】:

          我发现 Ctrl-CLick 是一种取消选择列表框项的非直观方式,并通过在我的 XAML (.net Core 5) 中添加 MouseDown 和 KeyDown 事件并创建如下事件处理程序来修复该行为:

          private void lboxScanList_MouseDown(object sender, MouseButtonEventArgs e) {
              // user clicked on a non-item - deselect all
              lboxScanList.UnselectAll();
          }
          
          private void lboxScanList_KeyDown(object sender, KeyEventArgs e) {
              if (e.Key == Key.Escape) {
                  lboxScanList.UnselectAll();
              }
          }
          

          这使您可以使用 Esc 取消选择或在任何项目上单击鼠标,但在我觉得更直观的列表框上。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-12-09
            • 1970-01-01
            • 1970-01-01
            • 2017-01-04
            • 1970-01-01
            • 2011-07-02
            相关资源
            最近更新 更多