【问题标题】:LongListSelector: Item tap?LongListSelector:项目点击?
【发布时间】:2012-12-22 07:41:06
【问题描述】:

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

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

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

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

我的第二个愿望是在物品被点击时对其产生影响。有什么标准的方法吗?

【问题讨论】:

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


【解决方案1】:

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

奥利弗

【讨论】:

    【解决方案2】:

    先把这个添加到*.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
    }
    

    【讨论】:

      【解决方案3】:

      我的第二个愿望是在物品被点击时对其产生影响。是 有什么标准的方法吗?

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

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

      【讨论】:

        【解决方案4】:
         private void Item_tap(object sender, RoutedEventArgs e)
                {
                    var element = (FrameworkElement)sender;
                    DataSource data = (DataSource)element.DataContext;
        
        
                }
        

        【讨论】:

          【解决方案5】:

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

          我不喜欢使用 Selected 属性,而是以这种方式获得点击项(而且我没有发现任何错误):

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

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

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

          FindParent 类似于 find child 在这个问题:How can I find WPF controls by name or type?

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

          【讨论】:

            【解决方案6】:

            您可以在每个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 将触发新的 @987654328 @ 事件,但第二个事件被 if 语句捕获)

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

            【讨论】:

            • 是的,这就是我最终所做的。但它看起来像是一个非常平常的任务的黑客。你不觉得吗?
            • 天才。非常感谢@Stevie。
            • @Stevie 我的 longlistselector 没有在视图模型或代码隐藏中触发 selectionChanged 事件。我的长列表选择器位于数据透视控件中,并且它有一个数据模板。是什么原因
            • @Eldho - 没有看到代码就不可能说;如果您还没有这样做,我建议您发布一个问题:)
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多