Alessandro Del Sole's Blog

{ A programming space about Microsoft® .NET® }
posts - 1902, comments - 2047, trackbacks - 352

My Links

News

Your host

This is me! Questo spazio è dedicato a Microsoft® .NET®, di cui sono molto appassionato :-)

Cookie e Privacy

Disabilita cookie ShinyStat

Microsoft MVP

My MVP Profile

Microsoft Certified Professional

Microsoft Specialist

Il mio libro su VB 2015!

Pre-ordina il mio libro su VB 2015 Pre-ordina il mio libro "Visual Basic 2015 Unleashed". Clicca sulla copertina per informazioni!

Il mio libro su WPF 4.5.1!

Clicca sulla copertina per informazioni! E' uscito il mio libro "Programmare con WPF 4.5.1". Clicca sulla copertina per informazioni!

These postings are provided 'AS IS' for entertainment purposes only with absolutely no warranty expressed or implied and confer no rights.
If you're not an Italian user, please visit my English blog

Le vostre visite

I'm a VB!

Guarda la mia intervista a Seattle

Follow me on Twitter!

Altri spazi

GitHub
I miei progetti open-source su GitHub

Article Categories

Archives

Post Categories

Image Galleries

Privacy Policy

Xamarin.Forms, ListView ed effetti indesiderati

Ancora su Xamarin.Forms e la ListView, in binding a una collection. Su un progetto Android che sto seguendo mi è capitato di avere un data template XAML abbastanza articolato, ma in realtà con pochissimi elementi da visualizzare eppure con un problema di rendering.

Nel mio caso, i vari elementi della lista dovevano espandersi e richiudersi al touch. Il problema è che, una volta chiusi, rimanevano disegnati sul display alcuni elementi della visualizzazione "aperta". Sparivano solamente ad un successivo tocco sul display e anche forzare un refresh della UI non portava beneficio, con un pessimo effetto visivo per l'utente. Il codice non aveva difetti, ma con data template articolati Xamarin.Forms fa fatica.

Per varie ragioni non era possibile usare i controlli nativi, possibilità dell'ultima release di Xamarin.Forms, ma la soluzione è stata semplicemente quella di ricorrera a un custom renderer (che, per vie traverse, fa la stessa cosa). Per esempio, con questa classe si implementa un custom renderer che implementa alcune proprietà come la caching strategy:

using Xamarin.Forms.Platform.Android; 
using Xamarin.Forms;
using
 MyApp.Droid.Controls;

[assemblyExportRenderer(typeof(Xamarin.Forms.ListView), typeof(CustomListViewRenderer))]
namespace
 MyApp.Droid.Controls
{    
public
 class CustomListViewRenderer : ListViewRenderer
     {
         protected override void OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.ListView> e)
         {
             base.OnElementChanged(e);
             Control.ScrollingCacheEnabled = true;
             Control.CacheColorHint = Android.Graphics.Color.Transparent;
             Control.Divider = null;
         }
     }
}

Nota bene che in questo caso sto usando il renderer direttamente sulla ListView di Xamarin.Forms, ciò implica che ogni qual volta utilizzerò la ListView, questa verrà sostituita dal renderer. Se non voglio questo, mi basta creare una classe che eredita da ListView.

Nel codice sopra si vede come ScrollingCacheEnabled consenta di impostare la caching strategy, CacheColorHint stabilisce come ciascun elemento della lista sia disegnato su un elemento che abbia sfondo del colore specificato e il separatore tra elementi (null in questo caso, cioè nessun separatore).

In questo modo, ricorrendo alla ListView nativa, abbiamo evitato problemi di disegno non automaticamente aggiornato.

Alessandro

Print | posted on martedì 17 gennaio 2017 00:00 | Filed Under [ Xamarin ]

Powered by:
Powered By Subtext Powered By ASP.NET