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;
}
}
}