Windows Phone 8でLongListSelectorコントロールを使用していますが、アイテムのタップを処理するための最良の方法がわかりません。私が見つけたいくつかの例は、SelectionChangedイベントに依存しています。ただし、このソリューションにはバグがあります。新しいページを開くアイテムをタップしてから、同じアイテムをもう一度タップすると、このアイテムは既に選択されているため機能しないため、SelectionChangedはトリガーされません。
タップイベントに登録して、現在選択されているアイテムをタップされたアイテムとして使用しようとしましたが、現在選択されているアイテムが期待したものと異なる場合があります。
ItemTemplateをボタンでラップし、各アイテムのタップを処理することもできますが、ボタンのスキンを変更して、シンプルなリストアイテムのように見えるようにする必要があります。
最後に、そのような基本的なことを達成するのがなぜそれほど複雑なのか理解できません。私が見逃したシンプルで標準的な方法はありますか?
私の2番目の願いは、タップされたときにアイテムに影響を与えることです。それを行うための標準的な方法はありますか?
各null
イベントの最後にLongListSelectorのSelectedItem
を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イベントを2回発生させますが、2回目は何も起こらず、目的の動作が得られるはずです(つまり、SelectedItem
をnull
に設定すると、新しいSelectionChanged
イベントですが、この2番目のイベントはifステートメントでキャッチされます)
質問の2番目の部分については、新しい質問を投稿することをお勧めします。
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は、必要に応じてアイテムテンプレートを手動で変更する必要があるオブジェクトです(たとえば、「選択された」状態を設定するため)。
private void Item_tap(object sender, RoutedEventArgs e)
{
var element = (FrameworkElement)sender;
DataSource data = (DataSource)element.DataContext;
}
私の2番目の願いは、タップされたときにアイテムに影響を与えることです。それを行うための標準的な方法はありますか?
これのためにあなたがこれをあなたのコントロール(またはあなたがこの効果を持ちたいと思うstackpanel)に加える必要がある唯一のこと:
<StackPanel toolkit:TiltEffect.IsTiltEnabled="True">
ハリルの答えに加えて:
まず最初に、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
オリバー
まず、これを* .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
}