WP7: Estilizar elementos de ListBox

Soy nuevo en el desarrollo de Windows Phone 7. Necesito crear una página muy similar a la página de la aplicación de configuración. Algo como esto (pero sin el menú en la parte superior y el subtexto para cada elemento):

(fuente: dotnetapp.com)

Hasta ahora tengo un cuadro de lista con elementos, pero al hacer clic en uno de los elementos, el color del elemento cambia y no tiene el efecto de "botón presionado" como lo tiene la aplicación de configuración.

La primera pregunta es cómo creo este hermoso efecto de botón presionado (observe que el botón se inclina cuando se presiona dependiendo de la posición del clic).

Mi segunda pregunta es sobre el estilo de los artículos de manera diferente. El ItemsSource del listBox se define así:

List<string> firstList;
List<string> secondList;

public MainPage()
{
    ...
    List<string> lst = new List<string>();
    lst.AddRange(firstList);
    lst.AddRange(secondList);
    listBox1.ItemsSource = lst;
    ...

Necesito diseñar los artículos de manera diferente, ya sea que provengan de firstList or secondList, por ejemplo, si el artículo es de firstList su color debe ser azul.

Creo que debería hacerse usando StaticResource, pero no estoy seguro. Tal vez necesite envolver la cadena de alguna manera para que tenga un captador para definir de qué lista proviene.

Gracias.

preguntado el 11 de junio de 12 a las 19:06

la respuesta a la primera pregunta es TiltEffect, parte del Silverlight Toolkit para Windows Phone. -

la segunda pregunta es diferente: ¿está diciendo que su 'segunda línea' (el latín en la imagen de arriba) es secondList, y los títulos son firstList? -

@WilliamMelani 10x, sobre el segundo comentario: no, solo necesito un bloque de texto en cada elemento, pero necesito diseñarlos de manera diferente (diferente color de texto) en función de si existen en firstList or secondList -

1 Respuestas

Se responde la pregunta 1 (ver el comentario de William Mekanis)

Para la pregunta 2, tiene un gran problema... está vinculando una lista de cadenas... no hay cambios para ver qué elemento proviene de qué lista. Crearía algo así como un modelo de vista para mi lista de fuentes de datos.

Algo así como (NotifyPropertyChanged se ignora aquí, impleméntelo si es necesario y use un ObservableCollection también;)):

public class ListDataSourceViewModel
{
    public string Text {get; set;}
    public bool IsFromFirstList {get; set;}
}

En caso de que tenga más listas, también podría usar una enumeración o lo que sea como identificador de lista ...

Que creas una nueva lista para el DataSource como:

lst.AddRange(firstList.Select(item => new ListDataSourceViewModel 
     {
         Text = item, IsFromFirstList = true
     }
).ToArray());
lst.AddRange(secondList.Select(item => new ListDataSourceViewModel 
{
     Text = item, IsFromFirstList = false
}
).ToArray());

Luego, cree una plantilla de datos para su elemento de lista que vincule el texto a un bloque de texto y el color de fuente de su bloque de texto a la propiedad IsFromFirstList usando un convertidor.

Este código está escrito desde la mente, sin VS... No estoy seguro si puedes copiar y pegar sin problema, pero debería darte una idea;) Si necesitas ayuda para crear la plantilla de datos y el convertidor, ¡solo dímelo!

Edit:

Reconsideré mi sugerencia... usar convertidores, especialmente en listas grandes (potenciales), no es una buena idea (desde el punto de vista del rendimiento). En su caso, de todos modos, no es un problema usar el color necesario directamente en el modelo de vista.

me gustaría cambiar

public bool IsFromFirstList {get; set;}

a

public Color WhatEverColor {get; set;}

configúrelo según sea necesario cuando se creen las máquinas virtuales y vincúlelo donde lo necesite.

¡Espero eso ayude!

Respondido el 13 de junio de 12 a las 07:06

De nuevo, soy totalmente nuevo en c# y xaml. Su solución es simple, pero ¿cómo uso un convertidor para vincular el color de fondo a IsFromFirstList propiedad ? - m_vitaly

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.