长列表选择器:项目点击?

36

我正在使用Windows Phone 8上的LongListSelector控件,但是无法找到处理项上的点击事件的最佳方法。

我找到的几个示例依赖于SelectionChanged事件。然而,这种解决方案存在错误,因为如果我点击打开新页面的项目,然后返回,再次点击相同的项,它将不起作用,因为此项已被选择,因此SelectionChanged未被触发。

我尝试注册点击事件并将当前选定的项用作所点击的项,但有时当前选定的项不是我期望的项。

我可以在每个项中包装ItemTemplate并处理每个项的单击事件,但我需要重新设计按钮以使其看起来像简单的列表项。

最后,我不理解为什么实现这样一个基本的功能如此复杂。是否有我错过的简单且标准的方法?

我的第二个需求是在项被点击时获得效果。是否有任何标准方法来实现这一点?


1
谢谢你发布这么好的问题.. :) - Mohit
好问题,也适合。 - IloveIniesta
还可以获得高亮显示:http://code.msdn.microsoft.com/wpapps/Highlight-a-selected-item-30ced444 - brendan
6个回答

41
你可以在每次 SelectionChanged 事件的结尾处将 LongListSelector 的 SelectedItem 设为 null。例如:
<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语句捕获)。
至于你问题的第二部分,你最好发布一个新问题。

3
是的,那最终是我做的。但这似乎是一种针对非常普通任务的hack方法。你不觉得吗? - Tom Esterez
@Stevie 我的长列表选择器在视图模型或代码后台中都没有触发selectionChanged事件。我的长列表选择器位于一个Pivot控件中,并且它有一个数据模板。这是什么原因? - Eldho
@Eldho - 没有看到代码是不可能说的;如果你还没有发帖提问,我建议你这样做 :) - Stevie

9

我使用了Tap事件来处理这个问题。

我更喜欢不使用Selected属性,而是通过以下方式获取被点击的项目(我还没有注意到任何错误):

MyListItemClass item = ((FrameworkElement)e.OriginalSource).DataContext 
                                                             as MyListItemClass;

另外,你可以通过从 e.OriginalSource 向上遍历 VisualTree 来获取原始的 ContentPresenter。如此一来:
ContentPresenter itemPresenter = SomeHelperClass
                              .FindParent<ContentPresenter>(e.OriginalSource,"");

在这个问题中,FindParent类似于查找子元素:如何按名称或类型查找WPF控件?

如果您想要手动更改项目模板(例如设置“已选定”状态),则需要使用ContentPresenter对象。


1
 private void Item_tap(object sender, RoutedEventArgs e)
        {
            var element = (FrameworkElement)sender;
            DataSource data = (DataSource)element.DataContext;


        }

0

首先将此代码添加到*.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
}

0

除了Halil的答案之外:

首先,您需要通过NuGet安装Windows Phone Toolkit(WPtoolkit)。然后在PhoneApplicationPage上添加命名空间声明。

xmlns:toolkit="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone.Controls.Toolkit"

在此之后,您可以将toolkit:TiltEffect.IsTiltEnabled="True"添加到控件定义中。

NOKIA对此进行了很好的文档记录: http://developer.nokia.com/community/wiki/Tilt_Effect_for_Windows_Phone

Oliver


0
我的第二个愿望是在点击项目时产生效果。有没有标准的方法来实现它?
为此,您需要做的唯一一件事就是将以下内容添加到您的控件(或要具有此效果的stackpanel)中:
<StackPanel toolkit:TiltEffect.IsTiltEnabled="True">

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接