Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF ListBoxItem ControlTemplate会中断一些鼠标向下/选择_C#_Wpf_Listbox - Fatal编程技术网

C# WPF ListBoxItem ControlTemplate会中断一些鼠标向下/选择

C# WPF ListBoxItem ControlTemplate会中断一些鼠标向下/选择,c#,wpf,listbox,C#,Wpf,Listbox,我对ListBoxItems有问题。我试图让列表框项目中的所有控件也选择它,因此单击文本框,标签,等将选择列表框项目。到目前为止相当简单 我还更改了ListBoxItem模板,将选择可视化从突出显示背景更改为仅绘制边框。也很简单 然而,这两者的结合似乎会导致MouseDown和PreviewMouseDown出现一些非常令人恼火的问题,特别是在我的例子中,关于网格中的标签,其中创建了一个被网格空间占据的“空白” 使用snoop,我可以看到PreviewMouseDown事件停止在ScrollVi

我对
ListBoxItem
s有问题。我试图让
列表框项目中的所有控件也选择它,因此单击
文本框
标签
,等将选择
列表框项目
。到目前为止相当简单

我还更改了
ListBoxItem
模板,将选择可视化从突出显示背景更改为仅绘制边框。也很简单

然而,这两者的结合似乎会导致
MouseDown
PreviewMouseDown
出现一些非常令人恼火的问题,特别是在我的例子中,关于
网格中的
标签
,其中创建了一个被
网格
空间占据的“空白”

使用snoop,我可以看到
PreviewMouseDown
事件停止在
ScrollViewer
中的
ListBox
,而不是一直到
ListBoxItem

XAML:


代码隐藏:

using System.Collections.Generic;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;

namespace ListBoxClickThroughTest
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            Items = new List<string>() { "1", "2" };
            InitializeComponent();
            DataContext = this;
        }

        public List<string> Items { get; set; }

        private void ListBoxItem_PreviewMouseDown(object sender, MouseButtonEventArgs e)
        {
            var listBoxItem = (ListBoxItem)sender;
            listBoxItem.IsSelected = true;
        }
    }
}
使用System.Collections.Generic;
使用System.Windows;
使用System.Windows.Controls;
使用System.Windows.Input;
名称空间列表框ClickThroughTest
{
/// 
///MainWindow.xaml的交互逻辑
/// 
公共部分类主窗口:窗口
{
公共主窗口()
{
Items=新列表(){“1”,“2”};
初始化组件();
DataContext=this;
}
公共列表项{get;set;}
private void ListBoxItem_PreviewMouseDown(对象发送器,鼠标按钮Ventargs e)
{
var listBoxItem=(listBoxItem)发送方;
listBoxItem.IsSelected=true;
}
}
}

但是,如果我删除
模板
setter,一切都很好。我缺少的模板中有什么魔力吗?我尝试将边框重命名为“Bd”,因为这是默认模板边框的名称,但没有成功。有什么想法吗?

如果将标签的水平对齐方式从“左”改为“拉伸”,这将解决问题并保持视觉格式不变


Mousedown事件仅在元素存在的区域中有效。通过使标签处于“左”水平对齐,您正在创建您提到的“空”,其中该级别上不存在可单击的元素。若要直观地看到差异,请尝试暂时设置给您带来问题的标签元素的背景属性,您将看到该元素并没有一直延伸到文本框。

单击第二个列表项右侧的空白时,是否尝试绘制边框?@aaron,我试图通过单击
ListBoxItem
中的任意位置来选择它,并通过边框显示所选内容(如屏幕截图中的顶部所选项目)。除了“ShortLabel”右边的空白处,代码在任何地方都可以使用。我不知道你可以使用Snoop查看事件!明亮的这修复了我在项目中遇到的一个长期存在的问题。太简单了。非常感谢。我估计在这样的情况下,
ListBoxItem
会得到
MouseDown
事件,在这种情况下会有一个空。再次感谢!知道为什么
ListBoxItem
没有接收到事件吗?我觉得这是一个很好的解决方案,但它并没有解释为什么这个事件似乎在
滚动查看器中消失。为了进一步@DanielJohnson的评论,如果我从
列表框项
中删除
内容模板
,而
标签
的水平对齐仍然是“左”的话,
边框
正在获取事件,而不是
ScrollViewer
,并且正确选择了
ListBoxItem
。给你什么,WPF?
using System.Collections.Generic;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;

namespace ListBoxClickThroughTest
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            Items = new List<string>() { "1", "2" };
            InitializeComponent();
            DataContext = this;
        }

        public List<string> Items { get; set; }

        private void ListBoxItem_PreviewMouseDown(object sender, MouseButtonEventArgs e)
        {
            var listBoxItem = (ListBoxItem)sender;
            listBoxItem.IsSelected = true;
        }
    }
}