如何确定单击了 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>
我正在使用 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>