LongListSelector:项目点击?
Posted
技术标签:
【中文标题】LongListSelector:项目点击?【英文标题】:LongListSelector: Item tap? 【发布时间】:2012-12-22 07:41:06 【问题描述】:我在 Windows Phone 8 上使用 LongListSelector 控件,但无法找出处理点击项目的最佳方法。 我发现的几个示例依赖于 SelectionChanged 事件。但是,这个解决方案是有问题的,因为如果我点击一个打开新页面的项目,回击,然后再次点击同一个项目,它将不起作用,因为该项目已被选中,因此不会触发 SelectionChanged。
我尝试注册到点击事件并使用当前选定的项目作为点击的项目,但有时当前选定的项目不是我期望的。
我可以将我的 ItemTemplate 包装在一个按钮中并处理每个项目的点击,但我需要重新设置按钮以使其看起来像一个简单的列表项。
最后,我不明白为什么要实现这样一个基本的东西这么复杂。我错过了一种简单而标准的方式吗?
我的第二个愿望是在物品被点击时对其产生影响。有什么标准的方法吗?
【问题讨论】:
感谢大佬发布这么好的问题..:) 好问题,也适合 也可以突出显示:code.msdn.microsoft.com/wpapps/… 【参考方案1】:除了halil的回答:
首先您需要通过 NuGet 安装 Windows Phone Toolkit (WPtoolkit)。 比在 PhoneApplicationPage 上添加命名空间声明。
xmlns:toolkit="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone.Controls.Toolkit"
在此之后,您可以将toolkit:TiltEffect.IsTiltEnabled="True"
添加到控件定义中。
诺基亚的文档很好: http://developer.nokia.com/community/wiki/Tilt_Effect_for_Windows_Phone
奥利弗
【讨论】:
【参考方案2】:先把这个添加到*.xaml页面里面
LongListSelectorSelectionChanged="listBox_SelectionChanged"
让它看起来像这样:
<toolkit:LongListSelector x:Name="listBox" SelectionChanged="listBox_SelectionChanged">
然后在事件处理程序中的 *.xaml.cs 文件中
private void listBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
// Write your logic on what you want to do with the selected item
【讨论】:
【参考方案3】:我的第二个愿望是在物品被点击时对其产生影响。是 有什么标准的方法吗?
为此,您只需将其添加到您的控件(或您想要此效果的堆栈面板):
<StackPanel toolkit:TiltEffect.IsTiltEnabled="True">
【讨论】:
【参考方案4】: private void Item_tap(object sender, RoutedEventArgs e)
var element = (FrameworkElement)sender;
DataSource data = (DataSource)element.DataContext;
【讨论】:
【参考方案5】:我通过 Tap 事件 处理完成了它。
我不喜欢使用 Selected 属性,而是以这种方式获得点击项(而且我没有发现任何错误):
MyListItemClass item = ((FrameworkElement)e.OriginalSource).DataContext
as MyListItemClass;
此外,您可以通过从 e.OriginalSource 向上导航 VisualTree 来获取原始项目 ContentPresenter。那样:
ContentPresenter itemPresenter = SomeHelperClass
.FindParent<ContentPresenter>(e.OriginalSource,"");
FindParent 类似于 find child 在这个问题:How can I find WPF controls by name or type?
ContentPresenter 是您需要手动更改项目模板的对象(例如,设置“选定”状态)。
【讨论】:
【参考方案6】:您可以在每个SelectionChanged
事件结束时null
您的 LongListSelector 的SelectedItem
。即
<phone:LongListSelector x:Name="LLS" SelectionChanged="LLS_SelectionChanged">
以及事件处理程序:
private void LLS_SelectionChanged(object sender, SelectionChangedEventArgs e)
// If selected item is null, do nothing
if (LLS.SelectedItem == null)
return;
// Navigate to the next page
NavigationService.Navigate(new Uri("/nextpage.xaml", UriKind.Relative));
// Reset selected item to null
LLS.SelectedItem = null;
您将触发 SelectionChanged 事件两次,但第二次不会发生任何事情,您应该得到您正在寻找的行为 - (即将 SelectedItem
设置为 null
将触发新的 @987654328 @ 事件,但第二个事件被 if 语句捕获)
至于你问题的第二部分,你最好发布一个新问题。
【讨论】:
是的,这就是我最终所做的。但它看起来像是一个非常平常的任务的黑客。你不觉得吗? 天才。非常感谢@Stevie。 @Stevie 我的 longlistselector 没有在视图模型或代码隐藏中触发 selectionChanged 事件。我的长列表选择器位于数据透视控件中,并且它有一个数据模板。是什么原因 @Eldho - 没有看到代码就不可能说;如果您还没有这样做,我建议您发布一个问题:)以上是关于LongListSelector:项目点击?的主要内容,如果未能解决你的问题,请参考以下文章
WP8 LongListSelector - 重新分配 ItemsSource 无效
LongListSelector SelectedItem 为 Null
如何在 windows phone 7 中禁用 LongListSelector 中的滚动视图