LongListSelector:项目点击

本文关键字:项目 LongListSelector | 更新日期: 2023-09-27 17:50:56

我在Windows Phone 8上使用LongListSelector控件,无法找出处理点击项目的最佳方法。我发现的几个例子依赖于SelectionChanged事件。然而,这个解决方案是有bug的,因为如果我点击打开一个新页面的项目,点击返回,然后再次点击相同的项目,它将不起作用,因为该项目已经被选中,所以SelectionChanged不会被触发。

我尝试注册到点击事件并使用当前选择的项目作为点击的项目,但有时当前选择的项目不是我所期望的。

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

最后,我不明白为什么实现这样一个基本的事情是如此复杂。有没有我漏掉的简单标准的方法?

我的第二个愿望是当物品被点击时对它产生效果。有什么标准的做法吗?

LongListSelector:项目点击

您可以在每个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事件两次,但没有什么会发生第二次,你应该得到你正在寻找的行为-(即设置SelectedItemnull将触发一个新的SelectionChanged事件,但这第二个事件被捕获在if语句)

关于你问题的第二部分,你最好发一个新的问题。

我用Tap事件处理完成了。

我不喜欢使用选择属性,而是用这种方式点击项目(我没有注意到任何错误):

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

同样,你可以通过导航到VisualTree从e.o originalsource获得原始项目ContentPresenter简单。这种方式:

ContentPresenter itemPresenter = SomeHelperClass
                              .FindParent<ContentPresenter>(e.OriginalSource,"");

在这个问题中FindParent类似于find child:我如何通过名称或类型找到WPF控件?

ContentPresenter就是你需要手动改变项目模板的对象(比如设置"selected"状态)。

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

        }

我的第二个愿望是当物品被点击时对它产生效果。是有什么标准的做法吗?

对于这个,你唯一需要做的就是把它添加到你的控件(或者你想要这个效果的stackpanel):

<StackPanel toolkit:TiltEffect.IsTiltEnabled="True">

首先将此添加到*。

内的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
}

除了哈利的回答:

首先,您需要通过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

奥利弗