ListBox
中的项目时,该项目已被选中。将#2更改为不需要控制键的推荐方法是什么?
答案 0 :(得分:4)
确保选择模式为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
答案 1 :(得分:4)
抱歉复活这个话题......
但是接受的答案并不能很好地满足我的所有需求,所以我对它进行了一些改进。我有几十个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 ... />
不再需要为每个SelectionChanged
上的每个ListBox
代码Window
。
答案 2 :(得分:1)
没有试图击败死马,但我有同样的问题,不能使用答案中使用的任何方法...希望有人可以从我的答案中受益:
我将选择模式设置为单一。我有双击事件,这使得多个选择模式不那么令人满意,很难获得双击工作。
SelectionChanged
仅在所选项目不同时才会触发。简单方法:使用PreviewLeftMouseDownClick
和PreviewLeftMouseUpClick
。将MyListBox.SelectedIndex
存储到预览鼠标按下事件中的对象变量中。
在预览鼠标向上事件中,将该事件从down事件与MyListBox.SelectedIndex
进行比较,如果它们是同一组MyListBox.SelectedIndex = -1
。
如果项目相同,则会取消选择该项目,因为索引编号的更改发生在预览之后和预览之前!
答案 3 :(得分:0)
使用Control键是建议的方法。这是一个在所有Windows中都保持一致的UI手势。你应该警惕改变这种行为。