c# xaml windows-phone-8 longlistselector

c# - LongListSelector: ¿Elemento toque?



xaml windows-phone-8 (6)

Estoy usando el control LongListSelector en Windows Phone 8 y no puedo encontrar la mejor manera de manejar un toque en un elemento. Los pocos ejemplos que he encontrado se basan en el evento SelectionChanged. Sin embargo, esta solución tiene errores porque si toco un elemento que abre una página nueva, regreso, y luego vuelvo a tocar el mismo elemento, no funcionará porque este elemento ya está seleccionado, por lo que SelectionChanged no se activará.

Intenté registrarme en el evento tap y usar el elemento seleccionado actual como el elemento tocado, pero algunas veces el elemento seleccionado actual no es el que esperaba.

Podría envolver mi ItemTemplate en un botón y manejar el grifo para cada elemento, pero tengo que reajustar el botón para que parezca un simple elemento de la lista.

Finalmente, no entiendo por qué es tan complicado lograr algo tan básico. ¿Hay alguna manera simple y estándar que extrañé?

Mi segundo deseo es obtener un efecto sobre el elemento cuando se toca. ¿Hay alguna forma estándar de hacerlo?


Mi segundo deseo es obtener un efecto sobre el elemento cuando se toca. ¿Hay alguna forma estándar de hacerlo?

Para esto, lo único que debe hacer es agregar esto a su control (o al panel de la pila donde desee tener este efecto):

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


Además de la respuesta de Halil:

Antes que nada, necesitas instalar el Windows Phone Toolkit (WPtoolkit) de NuGet. Luego agregue la declaración del espacio de nombres en PhoneApplicationPage.

xmlns:toolkit="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone.Controls.Toolkit"

Después de esto, puede agregar toolkit:TiltEffect.IsTiltEnabled="True" a la definición de control.

Es agradable documneted por NOKIA: http://developer.nokia.com/community/wiki/Tilt_Effect_for_Windows_Phone

Oliver


Lo hice con el manejo del evento Tap .

Prefiero no usar la propiedad Seleccionada, pero obtener un elemento interceptado de esta manera (y no he notado ningún error):

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

Además, puede obtener el elemento original ContentPresenter simple navegando hacia arriba a través de VisualTree desde e.OriginalSource. De esa manera:

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

Donde FindParent es similar a encontrar al niño en esta pregunta: ¿Cómo puedo encontrar los controles de WPF por nombre o tipo?

ContentPresenter es ese objeto que necesita para cambiar manualmente la plantilla del elemento si lo desea (para establecer el estado "seleccionado", por ejemplo).


primero agregue esto a la página * .xaml dentro del

LongListSelectorSelectionChanged="listBox_SelectionChanged"

para que se vea así:

<toolkit:LongListSelector x:Name="listBox" SelectionChanged="listBox_SelectionChanged">

luego en el archivo * .xaml.cs en el controlador de eventos

private void listBox_SelectionChanged(object sender, SelectionChangedEventArgs e) { // Write your logic on what you want to do with the selected item }


Podría anular el elemento SelectedItem su LongListSelector al final de cada evento SelectionChanged . Es decir

<phone:LongListSelector x:Name="LLS" SelectionChanged="LLS_SelectionChanged">

Y el controlador de eventos:

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; }

Disparará el evento SelectionChanged dos veces, pero nada sucederá la segunda vez y debería obtener el comportamiento que está buscando (es decir, establecer SelectedItem en null activará un nuevo evento SelectionChanged , pero este segundo evento quedará atrapado en el enunciado if)

En cuanto a la segunda parte de su pregunta, es mejor que publique una nueva pregunta.


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