LongListSelector:项目点击?

时间:2013-01-08 12:43:45

标签: c# xaml windows-phone-8 longlistselector

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

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

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

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

我的第二个愿望是在点击项目时对项目产生影响。有没有标准的方法呢?

6 个答案:

答案 0 :(得分:41)

您可以在每个null事件结束时SelectedItem您的LongListSelector的SelectionChanged。即。

<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语句捕获了

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

答案 1 :(得分:9)

我是通过点击事件处理完成的。

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

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?

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

答案 2 :(得分:1)

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


        }

答案 3 :(得分:0)

  

我的第二个愿望是在点击项目时对项目产生影响。是   有没有标准的方法呢?

为此,您需要做的唯一事情是将此添加到您的控件(或您希望产生此效果的stackpanel):

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

答案 4 :(得分: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
}

答案 5 :(得分:0)

除了哈利的回答:

首先,您需要安装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

奥利弗