Alessandro Del Sole's Blog

{ A programming space about Microsoft® .NET® }
posts - 1908, 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

Xamarin Certified Mobile Developer

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

Refresh di controlli WPF con Visual Basic 2008

I controlli WPF non hanno un metodo Refresh come in Windows Forms e a volte può capitare che il rendering non sia immediato. Ho cercato un po’ su Internet alcune soluzioni finché non mi sono imbattuto in questo post che mi è sembrato abbastanza valido. Lo riprendo e ne propongo la sintassi Visual Basic, oltre a qualche spiegazione in italiano :-)

 

Supponiamo di voler aggiungere un metodo chiamato Refresh ai controlli, sfruttando i metodi extension. Dobbiamo poi ricorrere al Dispatcher di WPF che si occupa di gestire il discorso del threading. Possiamo scrivere il seguente codice, che commenteremo di seguito:

 

<Extension()> Module Extensions

 

    'Action è un delegate che incapsula un metodo che non restituisce nulla

    Private EmptyDelegate As New Action(AddressOf DoSomething)

 

    <Extension()> Sub Refresh(ByVal ctrl As UIElement)

        ctrl.Dispatcher.Invoke(DispatcherPriority.Render, EmptyDelegate)

    End Sub

 

    'Ci serve solo come appoggio

    Private Sub DoSomething()

 

    End Sub

 

End Module

 

L’implementazione dei metodi extension in .NET 3.5 è ormai nota, quindi passiamo a descrivere il resto. Viene dichiarato un delegate di tipo Action. Action è uno speciale oggetto che rappresenta un delegate che incapsula un metodo che non restituisce nulla (come una Sub). Se avete iniziato a dare un’occhiata a VB 2010, le Statement Lambda possono prendere il posto degli Action.

 

Il metodo Refresh estende gli oggetti di tipo UIElement. Da tale classe derivano altre classi da cui derivano alcune tipologie di controlli, quindi estendere questa classe consente di lavorare su diverse tipologie di controlli. Il metodo Invoke del Dispatcher consente di eseguire in modo sincrono il delegate specificato alla priorità desiderata. Nel nostro caso il delegate da eseguire non fa nulla, semplicemente fa passare il tempo necessario al refresh del controllo e, infatti, la priorità data da Render indica proprio lo stato di rendering dei controlli.

 

Diventa quindi molto semplice utilizzare questo metodo extension, ad esempio nel modo seguente:

 

Button1.Refresh()

 

Non dimenticate di dare un’occhiata all’oggetto Dispatcher che in WPF ha una grande importanza.

 

Alessandro

Print | posted on sabato 27 giugno 2009 14:18 | Filed Under [ Visual Basic Windows Presentation Foundation ]

Powered by:
Powered By Subtext Powered By ASP.NET