我正在使用ItemsControl来显示数据绑定项目的列表,DataTemplate的每个核心都是一个Grid,我已经放置了所有绑定的控件。WPF中的可点击ItemsControl项目
我希望能够点击列表中每个项目的整个区域。但我无法弄清楚如何使区域可点击。
关于如何使整个网格区域可点击的任何建议将是伟大的。
我正在使用ItemsControl来显示数据绑定项目的列表,DataTemplate的每个核心都是一个Grid,我已经放置了所有绑定的控件。WPF中的可点击ItemsControl项目
我希望能够点击列表中每个项目的整个区域。但我无法弄清楚如何使区域可点击。
关于如何使整个网格区域可点击的任何建议将是伟大的。
您可以使用AttachedCommandBehavior classes from C# Disciples来实现此目的。
在ViewModel中定义一个命令,然后在Grid对象上使用ACB AttachedProperties将MouseLeftButtonUp
事件绑定到该命令。
一些代码来让你开始:
<Grid Name="grid" Height="30" ForceCursor="True" Cursor="Hand">
<acb:CommandBehaviorCollection.Behaviors>
<acb:BehaviorBinding Event="MouseLeftButtonUp" Command="{Binding Path=DataContext.EditEventCommand, RelativeSource={RelativeSource AncestorType={x:Type self:Dashboard}}}" CommandParameter="{Binding}" />
</acb:CommandBehaviorCollection.Behaviors>
</Grid>
编辑非MVVM解决方案。
当您没有根据MVVM指南设计应用程序时,上述代码段仍然可以工作,因为您本质上只是绑定到代码隐藏中的命令。
但是,如果你不想去定义命令的麻烦,你可以简单地指定勾,像这样的事件:
在XAML文件<Grid MouseLeftButtonUp="Grid_MouseLeftButtonUp">
。
,并在后台代码:
private void Grid_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
}
如果我不使用MVVM? (老实说不知道如何...) –
是的,这将仍然工作时不使用MVVM - 但我已经用一些额外的代码更新了我的答案。请注意,这将在MouseUp上触发,而不是Click。如果你想点击触发,你将需要捕获MouseDown和Up事件,启动一个计时器来测量每个事件之间的时间,然后相应地触发。 – fatty
为了使事情点击你通常可以把它包装在一个按钮,如果它应该是“看不见”的,您可以更改模板:
<Button.Template>
<ControlTemplate TargetType="{x:Type Button}">
<ContentPresenter />
</ControlTemplate>
</Button.Template>
+1:对于我的生活,我无法相信在四年中我一直在XAML写作,我从来没有想过这样做。 – fatty
@fatty:哦哇;我不能相信,大多数控件都有各种鼠标事件,但不是简单的点击,也许他们认为这个按钮将是无用的,因为无论如何,任何东西都可以被设置为一个样式([这里是我的一个相关问题] (http://stackoverflow.com/questions/4830164/what-is-the-best-way-to-simulate-a-click-with-mouseup-mousedown-events-or-other)) –
不错的一个,它很疯狂想想当你一遍又一遍地做同样的事情时,你可以得到怎样的感受。不能等到我能从这块岩石下面获得体面的'网络连接,我似乎生活在这个岩石下。 – fatty
究竟是什么导致了这个问题我试图理解为什么会发生这种情况。不应该点击一个项目导致预览鼠标事件隧道树下的treeviewitem?或者treeviewitem不是鼠标事件的焦点?我认为鼠标事件是基于命中测试提出的,它会得到视觉树上的最内层元素(我认为它会是treeviewitem),然后将其作为事件的目标 –