36

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

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

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

最后,我不明白为什么要实现这样一个基本的东西这么复杂。我错过了一种简单而标准的方式吗?

我的第二个愿望是在被点击时对项目产生影响。有没有标准的方法来做到这一点?

4

6 回答 6

41

您可以在每个事件结束时使用nullLongListSelector 。IESelectedItemSelectionChanged

<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 -陈述)

至于问题的第二部分,您最好发布一个新问题。

于 2013-01-09T10:30:45.463 回答
9

我通过Tap 事件处理完成了它。

我不喜欢使用 Selected 属性,而是以这种方式获取项目(而且我没有注意到任何错误):

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

此外,您可以通过从 e.OriginalSource 向上导航 VisualTree 来获取原始项目 ContentPresenter。那样:

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

FindParent 类似于 find child 在此问题中的位置:如何按名称或类型查找 WPF 控件?

ContentPresenter 是您需要手动更改项目模板的对象(例如,设置“选定”状态)。

于 2013-01-13T22:21:42.353 回答
1
 private void Item_tap(object sender, RoutedEventArgs e)
        {
            var element = (FrameworkElement)sender;
            DataSource data = (DataSource)element.DataContext;


        }
于 2013-11-13T10:50:45.953 回答
0

我的第二个愿望是在被点击时对项目产生影响。有没有标准的方法来做到这一点?

为此,您唯一需要做的是将其添加到您的控件(或您想要此效果的堆栈面板):

<StackPanel toolkit:TiltEffect.IsTiltEnabled="True">
于 2014-04-29T12:03:13.330 回答
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
}
于 2014-10-28T10:04:35.833 回答
0

除了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

奥利弗

于 2014-11-18T07:53:56.107 回答