我需要一个在第一次单击时选择并在第二次单击时取消选择的列表框,以便任何时候只选择零个或一个项目。
当您按住 crtl 时,选择/取消选择是在列表框中实现的(SelectionMode=“Single”),但不幸的是,我的用户都不知道这一点。
使用 SelectionMode="Multiple" 我们拥有我想要的确切功能,除了您可以选择多个项目......
更多背景:
我希望用户首先选择要登录的安装,然后提供凭据(以及其他一些选择)
为了实现这一点,我使用了一个具有扩展内容的列表框。为了帮助展开,我在列表框项的左侧制作了一个三角形,未展开时该三角形指向右侧,当您选择列表框项时,该三角形变为向下指向。
因此,首先用户会看到安装列表,然后,当他通过选择选择所需的项目时,列表框项目将扩展为他需要输入的其余信息。它非常好,并且运行良好,但测试报告称他们希望第二次单击三角形以取消选择(从而折叠展开的部分)。我必须承认我也点击了 ¤%& 箭头,期望该操作会导致崩溃......:-(
任何人都知道如何实现这一点(最好没有隐藏代码)?
执行此操作的常用方法是设置SelectionMode
模式为Multiple
然后取消选择除新选择的项目之外的所有项目SelectionChanged
event.
请参阅以下链接
-
WPF:列表框取消选择 https://stackoverflow.com/questions/2148937/wpf-listbox-unselecting
- ListBoxItem - 第二次单击时取消选择 http://social.msdn.microsoft.com/Forums/en/wpf/thread/5c8e0c4a-e716-41d5-9876-05b14d94b3ff
这是执行此操作的附加行为,可以像这样使用
<ListBox local:ListBoxSelectionBehavior.ClickSelection="True"
...>
列表框选择行为
public static class ListBoxSelectionBehavior
{
public static readonly DependencyProperty ClickSelectionProperty =
DependencyProperty.RegisterAttached("ClickSelection",
typeof(bool),
typeof(ListBoxSelectionBehavior),
new UIPropertyMetadata(false, OnClickSelectionChanged));
public static bool GetClickSelection(DependencyObject obj)
{
return (bool)obj.GetValue(ClickSelectionProperty);
}
public static void SetClickSelection(DependencyObject obj, bool value)
{
obj.SetValue(ClickSelectionProperty, value);
}
private static void OnClickSelectionChanged(DependencyObject dpo,
DependencyPropertyChangedEventArgs e)
{
ListBox listBox = dpo as ListBox;
if (listBox != null)
{
if ((bool)e.NewValue == true)
{
listBox.SelectionMode = SelectionMode.Multiple;
listBox.SelectionChanged += OnSelectionChanged;
}
else
{
listBox.SelectionChanged -= OnSelectionChanged;
}
}
}
static void OnSelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (e.AddedItems.Count > 0)
{
ListBox listBox = sender as ListBox;
var valid = e.AddedItems[0];
foreach (var item in new ArrayList(listBox.SelectedItems))
{
if (item != valid)
{
listBox.SelectedItems.Remove(item);
}
}
}
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)