【问题标题】:Clickable ItemsControl item in WPFWPF中的可点击ItemsControl项
【发布时间】:2011-08-28 01:04:27
【问题描述】:

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

我希望能够单击列表中每个项目的整个区域。但我不知道如何使该区域可点击。

任何关于如何使整个网格区域可点击的建议都会很棒。

【问题讨论】:

  • 究竟是什么导致了这个问题?我试图理解为什么会发生这种情况。不应该单击项目导致预览鼠标事件沿着树向下隧道到treeviewitem吗?还是 treeviewitem 不是鼠标事件的焦点?我认为鼠标事件是基于命中测试引发的,该测试将获取可视树上最里面的元素(我假设它是 treeviewitem),然后将其作为事件的目标

标签: wpf grid onclick


【解决方案1】:

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

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

【讨论】:

  • +1:在我的一生中,我无法相信在我用 XAML 编写的四年中,我从未想过这样做。
  • @fatty:哇哦;我无法相信大多数控件都有各种鼠标事件但不是简单的单击,也许他们认为按钮将无用,因为无论如何都可以像一个一样设置样式(here'd be a related question of mine
  • 很好,想想当你一遍又一遍地做同样的事情时,你会如何陷入你的历史中,这真是太疯狂了。我迫不及待地想从我似乎生活在这块岩石下获得一个体面的“网络连接”。
【解决方案2】:

您可以使用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 指南设计应用程序时,上述代码 sn-p 仍然有效,因为您实际上只是绑定到代码隐藏中的命令。

但是,如果您不想麻烦地定义命令,您可以简单地指定要挂钩的事件,如下所示:

XAML 文件中的&lt;Grid MouseLeftButtonUp="Grid_MouseLeftButtonUp"&gt;

在代码隐藏中:

    private void Grid_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
    {
    }        

【讨论】:

  • 如果我不使用 MVVM,这仍然有效吗? (老实说,目前还不知道如何......)
  • 是的,这在不使用 MVVM 时仍然有效——但我已经用一些额外的代码更新了我的答案。请注意,这将触发 MouseUp,而不是 Click。如果要在点击时触发,则需要同时捕获 MouseDown 和 Up 事件,启动一个计时器来测量每个事件之间所用的时间,然后相应地触发。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多