如何确定单击了 ListView Item 的哪个 child 元素?

How to determine which child element of a ListView Item was clicked?

我正在使用 XAML 和 C# 开发 windows phone 8.1 应用程序。我有一个 ListView 从绑定列表中获取其项目并通过 DataTemplate 显示它们。现在,在这个 DataTemplate 中有多个 child 元素,当用户点击列表中的项目时,我希望能够确定他实际触摸的 child 元素。视情况而定,应用程序应该在项目中展开包含更多详细信息的视图,或者导航到另一个页面。

ListView 的 ItemClick 事件处理程序是 ListView_ItemClick(object sender, ItemClickEventArgs e),我认为 e.OriginalSource 可能会给我答案,但这只是给了我单击的 ListItem。

我还没有尝试用按钮封装 children 并拦截它们的点击事件是否可行,但我很乐意尝试任何可能的替代方案。

使用 SelectionChanged 事件。

sender 对象转换为 ListView 类型,然后从 SelectedItem 属性.

中检索项目

这里有类似的问题,但针对的是不同的控件:

Get the index of the selected item in longlistselector

我刚刚自己找到了解决方案。我将 ListView 设置为 SelectionMode="None" 和 IsItemClickEnabled="False",然后我为各个子元素添加了 Tapped 处理程序。效果如我所愿。

我在一个 ListViewItem 中有一个 TextBlock 和一个图像,并且刚刚使用了 Image_PointerPressed 事件。这样做也会触发 ListView 的 ItemClick 事件,所以我先禁用它,做我想做的事情,然后重新启用 ItemClick 事件,以便在按下 TextBlock 时仍然触发。

后面的代码:

private async void imgDone_PointerPressed(object sender, PointerRoutedEventArgs e)
    {

        // disable click event so it won't fire as well
        lvwCouncils.IsItemClickEnabled = false;

        // do stuff
        MessageDialog m = new MessageDialog("User Details");
        await m.ShowAsync();

        // Re-enable the click event
        lvwCouncils.IsItemClickEnabled = true;
    }

Xaml:

 <ListView x:Name="lvwCouncils" ItemClick="lvwCouncils_ItemClicked"  IsItemClickEnabled="true" >
            <ListView.ItemTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal">
                        <TextBlock
                    Grid.Column="1"
                    Text="{Binding council_name}"
                    FontSize="24"
                    Margin="10,10,30,10"
                                    />
                        <Border Height="20" Width="20" Margin="10,10,0,10" >
                            <Image x:Name="imgDone" 
                                   Source="Assets/user_earth.png" Stretch="UniformToFill" PointerPressed="imgDone_PointerPressed"/>
                        </Border>
                    </StackPanel>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>