web-dev-qa-db-ja.com

LongListSelector:アイテムをタップしますか?

Windows Phone 8でLongListSelectorコントロールを使用していますが、アイテムのタップを処理するための最良の方法がわかりません。私が見つけたいくつかの例は、SelectionChangedイベントに依存しています。ただし、このソリューションにはバグがあります。新しいページを開くアイテムをタップしてから、同じアイテムをもう一度タップすると、このアイテムは既に選択されているため機能しないため、SelectionChangedはトリガーされません。

タップイベントに登録して、現在選択されているアイテムをタップされたアイテムとして使用しようとしましたが、現在選択されているアイテムが期待したものと異なる場合があります。

ItemTemplateをボタンでラップし、各アイテムのタップを処理することもできますが、ボタンのスキンを変更して、シンプルなリストアイテムのように見えるようにする必要があります。

最後に、そのような基本的なことを達成するのがなぜそれほど複雑なのか理解できません。私が見逃したシンプルで標準的な方法はありますか?

私の2番目の願いは、タップされたときにアイテムに影響を与えることです。それを行うための標準的な方法はありますか?

36
Tom Esterez

nullイベントの最後にLongListSelectorのSelectedItemSelectionChangedできます。つまり.

<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イベントを2回発生させますが、2回目は何も起こらず、目的の動作が得られるはずです(つまり、SelectedItemnullに設定すると、新しいSelectionChangedイベントですが、この2番目のイベントはifステートメントでキャッチされます)

質問の2番目の部分については、新しい質問を投稿することをお勧めします。

41
Stevie

Tap event処理でそれを行いました。

私は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は、必要に応じてアイテムテンプレートを手動で変更する必要があるオブジェクトです(たとえば、「選択された」状態を設定するため)。

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


        }
1
Poojan Dave

私の2番目の願いは、タップされたときにアイテムに影響を与えることです。それを行うための標準的な方法はありますか?

これのためにあなたがこれをあなたのコントロール(またはあなたがこの効果を持ちたいと思うstackpanel)に加える必要がある唯一のこと:

<StackPanel toolkit:TiltEffect.IsTiltEnabled="True">
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

オリバー

0
Oliver

まず、これを* .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
AVIK DUTTA