Ich verwende das LongListSelector-Steuerelement unter Windows Phone 8 und kann nicht herausfinden, wie ein Element am besten mit einem Antippen behandelt werden kann .. Die wenigen Beispiele, die ich gefunden habe, basieren auf dem SelectionChanged-Ereignis. Diese Lösung ist jedoch fehlerhaft. Wenn ich auf ein Element tippe, das eine neue Seite öffnet, erneut tippen und dann erneut auf dasselbe Element tippen, funktioniert es nicht, da dieses Element bereits ausgewählt ist. SelectionChanged wird also nicht ausgelöst.
Ich habe versucht, mich für das Tap-Ereignis zu registrieren und das aktuell ausgewählte Element als das angezapfte Element zu verwenden, aber manchmal ist das aktuell ausgewählte Element nicht das, was ich erwarte.
Ich könnte mein ItemTemplate in eine Schaltfläche einwickeln und das Tippen für jedes Element ausführen, aber ich muss die Schaltfläche neu filtern, damit sie wie ein einfaches Listenelement aussieht.
Schließlich verstehe ich nicht, warum es so kompliziert ist, so eine grundlegende Sache zu erreichen. Gibt es einen einfachen und standardmäßigen Weg, den ich vermisst habe?
Mein zweiter Wunsch ist es, einen Effekt auf den Gegenstand zu erzielen, wenn er berührt wird. Gibt es eine Standardmethode dafür?
Sie können null
am Ende jedes SelectedItem
-Ereignisses SelectionChanged
Ihres LongListSelector __. Das heißt.
<phone:LongListSelector x:Name="LLS" SelectionChanged="LLS_SelectionChanged">
Und der Eventhandler:
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;
}
Sie werden das SelectionChanged-Ereignis zweimal auslösen, aber beim zweiten Mal wird nichts passieren, und Sie sollten das gewünschte Verhalten erhalten - (dh wenn Sie SelectedItem
auf null
setzen, wird ein neues SelectionChanged
-Ereignis ausgelöst, aber dieses zweite Ereignis wird abgefangen in der if-Anweisung)
Für den zweiten Teil Ihrer Frage können Sie eine neue Frage posten.
Ich habe es mit dem Tap-Event gemacht.
Ich ziehe es vor, die Selected-Eigenschaft nicht zu verwenden, aber auf diese Weise getappte Elemente zu erhalten (und ich habe keine Fehler bemerkt):
MyListItemClass item = ((FrameworkElement)e.OriginalSource).DataContext
as MyListItemClass;
Sie können den ursprünglichen Inhalt ContentPresenter auch einfach erhalten, indem Sie von e.OriginalSource durch VisualTree navigieren. Dieser Weg:
ContentPresenter itemPresenter = SomeHelperClass
.FindParent<ContentPresenter>(e.OriginalSource,"");
Wo FindParent in dieser Frage ähnlich ist, um ein Kind zu finden: Wie finde ich WPF-Steuerelemente nach Name oder Typ?
ContentPresenter ist das Objekt, das Sie benötigen, um die Elementvorlage manuell zu ändern, wenn Sie möchten (beispielsweise den Status "Ausgewählt" setzen).
private void Item_tap(object sender, RoutedEventArgs e)
{
var element = (FrameworkElement)sender;
DataSource data = (DataSource)element.DataContext;
}
Mein zweiter Wunsch ist es, einen Effekt auf den Gegenstand zu erzielen, wenn er berührt wird. Ist gibt es eine Standardmethode, um es zu tun?
Dazu müssen Sie dies Ihrem Steuerelement (oder dem Stackpanel, auf dem Sie diesen Effekt erzielen möchten) hinzufügen.
<StackPanel toolkit:TiltEffect.IsTiltEnabled="True">
Zusätzlich zur Antwort von halil:
Zunächst müssen Sie das Windows Phone Toolkit (WPtoolkit) von NuGet installieren. Fügen Sie dann die Namespace-Deklaration auf der PhoneApplicationPage hinzu.
xmlns:toolkit="clr-namespace:Microsoft.Phone.Controls;Assembly=Microsoft.Phone.Controls.Toolkit"
Danach können Sie der Steuerelementdefinition toolkit:TiltEffect.IsTiltEnabled="True"
hinzufügen.
Es ist schön, von NOKIA dokumentiert: http://developer.nokia.com/community/wiki/Tilt_Effect_for_Windows_Phone
Oliver
fügen Sie dies zunächst der * .xaml-Seite in der
LongListSelectorSelectionChanged="listBox_SelectionChanged"
damit es so aussieht:
<toolkit:LongListSelector x:Name="listBox" SelectionChanged="listBox_SelectionChanged">
dann in der * .xaml.cs-Datei im Event-Handler
private void listBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
// Write your logic on what you want to do with the selected item
}