C# WPF列表框通过单击空白区域删除所选内容

C# WPF列表框通过单击空白区域删除所选内容,c#,wpf,listbox,C#,Wpf,Listbox,我有一个wpf列表框,其中包含一个矩形的自定义项模板。 可以选择列表框中的每个项目(一次只能选择一个)。 我想添加一种行为,当用户单击一个不是项目的位置时(例如,列表框上的一个空白点,它不是项目),所选项目将被取消选择 有什么想法吗? 谢谢 例如,使用简单的列表框: 项目1 项目2 我正在寻找的行为是,当用户单击pixel 500(它是列表框的一部分,但不在项目上)时,当前选定的项目将被取消选择 对于列表框中的每个项目都可以选择(一次只能选择一个)。 你可以想出以下其中一个 1-选择项目后禁用

我有一个wpf
列表框
,其中包含一个矩形的自定义项模板。 可以选择
列表框中的每个项目(一次只能选择一个)。
我想添加一种行为,当用户单击一个不是项目的位置时(例如,
列表框
上的一个空白点,它不是项目),所选项目将被取消选择

有什么想法吗? 谢谢

例如,使用简单的列表框: 项目1 项目2


我正在寻找的行为是,当用户单击pixel 500(它是
列表框的一部分,但不在项目上)时,当前选定的项目将被取消选择

对于
列表框中的每个项目都可以选择(一次只能选择一个)。

你可以想出以下其中一个

1-选择项目后禁用该项目


2-在后端维护一个列表,以标记每个索引可选择或不可选择。

为确保只选择一个项目,请将其放入列表框:

SelectionMode="Single"
然后,对于单击某处时取消选择,您可以尝试检查此事件

PreviewMouseLeftButtonUp
LostFocus()

关于,

简单的解决方案是将属性数据绑定到
列表框。选择EdItem
属性并将其设置为
null
,无论何时清除选择:

<ListBox ItemsSource="{Binding YourItems}" SelectedItem="{Binding SelectedItem}" 
    SelectionMode="Single" />
SelectedItem = null;
你什么时候会这么做?您可以将处理程序附加到
窗口的
,或UI中的任何其他控件。在handler方法中,您可以执行命中测试以查看用户单击的项目:

HitTestResult hitTestResult = 
    VisualTreeHelper.HitTest(controlClickedOn, e.GetPosition(controlClickedOn));
Control controlUnderMouse = hitTestResult.VisualHit.GetParentOfType<Control>();
当然,有很多方法可以做到这一点,你将不得不填补我留下的几个空白点,但你应该得到的想法


编辑>>>

泛型
GetParentOfType
方法是一种自定义方法,在名为
DependencyObjectExtensions
的单独类中定义:

public static class DependencyObjectExtensions
{
    public static T GetParentOfType<T>(this DependencyObject element) 
        where T : DependencyObject
    {
        Type type = typeof(T);
        if (element == null) return null;
        DependencyObject parent = VisualTreeHelper.GetParent(element);
        if (parent == null && ((FrameworkElement)element).Parent is DependencyObject) 
            parent = ((FrameworkElement)element).Parent;
        if (parent == null) return null;
        else if (parent.GetType() == type || parent.GetType().IsSubclassOf(type)) 
            return parent as T;
        return GetParentOfType<T>(parent);
    }

    ...
}
公共静态类DependencyObjectExtensions
{
公共静态T GetParentOfType(此DependencyObject元素)
其中T:DependencyObject
{
类型=类型(T);
if(element==null)返回null;
DependencyObject parent=VisualTreeHelper.GetParent(元素);
if(parent==null&((FrameworkElement)元素)。parent是DependencyObject)
父元素=((FrameworkElement)元素);
if(parent==null)返回null;
else if(parent.GetType()==type | | parent.GetType().IsSubclassOf(type))
将父对象返回为T;
返回GetParentOfType(父级);
}
...
}

尝试确保列表框的背景颜色是“透明的”

请提供一些代码,使您的问题更易于理解。您如何确保列表框始终包含空白区域?谢谢,我已采用了您的解决方案,并从中创建了一个行为。很好!为什么我找不到
GetParentOfType()
函数?@starkshang,这是因为它是一个自定义方法。我现在添加了它的代码。抱歉延迟回复。@Sheridan,谢谢,我已经查过了,这是一个语法,我以前不知道。@Sheridan-WTH?这是一个可行的答案,而不是另一个问题。改为“努力确保…”好吧,这不再是一个问题,但很难回答。。。更多的是评论,所以我的反对票仍然存在。坦白地说,我很惊讶有你这样的名声的人会在这个网站上提供一句话的答案。即使是新来接电话的人也比你付出了更多的努力。为什么要费心回答呢?你不会从那句话中赢得任何声誉,当然也不会帮助解决问题作者的问题。Stack Overflow社区为这个网站以及问答的总体质量感到自豪。请以后以实物捐助。谢谢,如果用户选择的意思是“专注”,那么我的答案肯定是可行的,而且非常简单。通过您的命中测试示例,我假设您理解透明度可以使元素不被命中测试。就声誉而言,我来这里不是为了赢得声誉,否则我会赢得更多的声誉。我在这里学习,并在可能的时候提供反馈。你什么时候开始代表SO社区的?让答案自己说话,不要投反对票,因为与你的答案相竞争的答案可能更简单,也可能更正确。
public static class DependencyObjectExtensions
{
    public static T GetParentOfType<T>(this DependencyObject element) 
        where T : DependencyObject
    {
        Type type = typeof(T);
        if (element == null) return null;
        DependencyObject parent = VisualTreeHelper.GetParent(element);
        if (parent == null && ((FrameworkElement)element).Parent is DependencyObject) 
            parent = ((FrameworkElement)element).Parent;
        if (parent == null) return null;
        else if (parent.GetType() == type || parent.GetType().IsSubclassOf(type)) 
            return parent as T;
        return GetParentOfType<T>(parent);
    }

    ...
}