WPF中可点击的ItemsControl项

7

我正在使用ItemsControl来显示一个数据绑定的项目列表,每个项目的DataTemplate的核心是一个Grid,我在这个Grid上放置了所有绑定的控件。

我希望能够点击列表中每个项目的整个区域。但我无法想出如何使这个区域可点击。

有什么建议可以让整个Grid区域可点击吗?


这个问题到底是什么原因引起的?我试图理解为什么会发生这种情况。点击一个项目不应该导致预览鼠标事件沿着树向下进行吗?或者说,treeviewitem不是鼠标事件的焦点吗?我认为,鼠标事件是基于命中测试引发的,它会获取可视树上最内部的元素(我假设是treeviewitem),然后将其作为事件的目标。 - James Joshua Street
2个回答

16

要使某个元素可点击,通常可以将其包装在 Button 中。如果它应该是“不可见的”,您可以更改模板:

<Button.Template>
    <ControlTemplate TargetType="{x:Type Button}">
        <ContentPresenter />
    </ControlTemplate>
</Button.Template>

2
+1:我真的无法相信,在四年的XAML编程生涯中,我从未想过这样做。 - fatty
@fatty: 哇哦,我简直不敢相信大多数控件都有各种鼠标事件但却没有一个简单的点击事件。也许他们认为按钮会变得无用,因为所有东西都可以像按钮一样进行样式设计。(这里是我的相关问题链接:https://dev59.com/hG445IYBdhLWcg3wfKcZ) - H.B.
不错,想想当你一遍又一遍地做同样的事情时,你会陷入多么困境中,真是疯狂。迫不及待地想要摆脱这块似乎生活在岩石下的地方,拥有一个像样的网络连接。 - fatty

4
您可以使用C#门徒的附加命令行为类来实现此功能。
在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,这仍然有效吗?(老实说,我还不知道如何做...) - Adam Haile
是的,即使不使用MVVM,这仍然有效-但我已经更新了我的答案,并附加了一些额外的代码。请注意,这将在MouseUp上触发,而不是Click。如果您想在单击时触发,则需要捕获MouseDown和Up事件,启动计时器来测量每个事件之间所花费的时间,然后相应地触发。 - fatty

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接