我正在使用Windows phone8上的LongListSelector控件,但找不到处理点击项目的最佳方法。我找到的少数几个示例依赖于SelectionChanged事件。然而,这个解决方案是错误的,因为如果我点击一个打开新页面的项目,点击back,然后再次点击相同的项目,它将不会工作,因为这个项目已经被选中,所以SelectionChanged不会被触发。
我试图注册到点击事件,并使用当前选择的项目作为点击的项目,但有时当前选择的项目不是我期望的项目。
我可以将我的ItemTemplate包装在一个按钮中,并处理每个项目的点击,但我需要重新设置按钮的皮肤,使其看起来像一个简单的列表项。
最后,我不明白为什么实现这样一个基本的东西是如此复杂。有没有我错过的简单和标准的方式?
我的第二个愿望是在项目被点击时获得效果。有没有什么标准的方法呢?
发布于 2013-01-09 18:30:45
您可以在每个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将触发一个新的SelectionChanged事件,但是第二个事件被捕获到if-语句中)
至于你问题的第二部分,你可能更好地发布一个新的问题。
发布于 2013-01-14 06:21:42
我使用点击事件处理完成了这项工作。
我不喜欢使用选定的属性,而是以这种方式点击项(我没有注意到任何bug):
MyListItemClass item = ((FrameworkElement)e.OriginalSource).DataContext
as MyListItemClass;此外,您还可以通过从e.OriginalSource向上导航VisualTree来简单地获取原始项目ContentPresenter。这样的话:
ContentPresenter itemPresenter = SomeHelperClass
.FindParent<ContentPresenter>(e.OriginalSource,"");在此问题中,FindParent与查找子级相似:How can I find WPF controls by name or type?
如果您想要手动更改项模板(例如设置"selected“状态),ContentPresenter就是您手动更改项模板所需对象。
发布于 2013-11-13 18:50:46
private void Item_tap(object sender, RoutedEventArgs e)
{
var element = (FrameworkElement)sender;
DataSource data = (DataSource)element.DataContext;
}https://stackoverflow.com/questions/14215227
复制相似问题