web-dev-qa-db-de.com

LongListSelector: Element antippen?

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?

36
Tom Esterez

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.

41
Stevie

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). 

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


        }
1
Poojan Dave

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">
0
halil

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

0
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
}
0
AVIK DUTTA