【发布时间】:2010-01-27 17:25:13
【问题描述】:
- 当用户单击我的单选
ListBox中的某个项目时,该项目被选中。 - 当用户第二次单击某个项目时,除非他们按住控制键,否则该项目不会被取消选择。
将 #2 更改为不需要控制键的推荐方法是什么?
【问题讨论】:
ListBox 中的某个项目时,该项目被选中。将 #2 更改为不需要控制键的推荐方法是什么?
【问题讨论】:
确保选择模式为Multiple。通过选择多个:
您只需单击鼠标即可使用鼠标选择和取消选择您想要的任何项目。但是,如果您一次只需要一个选定的项目,则必须在 SelectionChanged 事件中取消选择代码中的其他项目。
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
【讨论】:
抱歉,这个话题复活了……
但是接受的答案并不能很好地满足我的所有需求,所以我对其进行了一些改进。我有几十个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。
【讨论】:
不想打败死马,但我遇到了同样的问题,无法使用此处答案中使用的任何方法...希望有人能从我的回答中受益:
我将选择模式设置为单一。我有双击事件,这使得多选模式不太理想,并且很难让双击工作。
SelectionChanged 仅在所选项目不同时触发。简单的方法:使用PreviewLeftMouseDownClick 和PreviewLeftMouseUpClick。将MyListBox.SelectedIndex 存储到预览鼠标按下事件中的对象变量中。
在预览鼠标向上事件中,将向下事件中的变量与MyListBox.SelectedIndex 进行比较,如果它们相同,则设置MyListBox.SelectedIndex = -1。
如果相同,则取消选择该项目,因为索引号的更改发生在预览向下和向上预览之前!
【讨论】:
使用控制键是推荐的方式来做到这一点。这是一个 UI 手势,在所有 Windows 中都是一致的。你应该警惕改变这种行为。
【讨论】:
我发现 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 取消选择或在任何项目上单击鼠标,但在我觉得更直观的列表框上。
【讨论】: