WPF

Windows Presentation Foundation

DependencyProperty e valore di default

Quando si crea una proprietà di dipendenza non si gestisce direttamente il valore di default ma lo si specifica attraverso i metadati. Se la proprietà è un Reference Type il valore di default viene applicato a tutte le istanze del tipo e non alle singole istanze. Questo comportamento è particolarmente critico quando si lavora con delle collezioni. Per capire meglio questo comportamento e le sue conseguenze consideriamo una semplice applicazione con una finestra contenente due istanze di un UserControl L'UserControl (chiamato SampleUserControl) possiede una DependencyProperty con dati di tipo Reference come ad esempio il tipo Person. Codice dell'UserControl (il...

DataBinding di specifici oggetti in collezioni

Il DataBinding in WPF è sicuramente un elemento essenziale ed un primo cittadino ma supponiamo di avere una collezione generica come ObservableCollection<T>, dove T è una nostra classe, per esempio la classica classe Person contenente le proprietà Nome, Cognome e Descrizione: come facciamo a visualizzare tramite XAML nella nostra finestra la descrizione di Mario Rossi? Diagramma della classe Person Questo scenario non è direttamente supportato in quanto la sintassi di Binding permette di specificare proprietà, sottoproprietà ed indicizzatori ma non selezionare oggetti in collezioni dato il valore di alcune loro proprietà. NON è possibile per esempio scrivere, supponendo come contesto...

Sincronizziamo le animazioni con WPF

WPF offre un gran supporto alle applicazioni che vogliono utilizzare animazioni. Tramite poche righe di Xaml possiamo dire agevolmente che vogliamo animare la proprietà di riempimento di un oggetto da un colore ad un altro in un certo periodo di tempo infinite volte utilizzando perfino delle funzioni matematiche per variare non linearmente l'animazione. Esempio di animazione di un colore in Xaml Non è però previsto un modo per aggiungere animazioni in maniera sincronizzata a quelle già esecuzione. Se iniziamo un'animazione che sfuma dal bianco al rosso un ellisse e, supponiamo a metà dell'animazione, vogliamo iniziare un'altra animazione su un altro...

Scatenare gli eventi del Mouse o della Stilo in un Panel

Controlli Panel come Grid, StackPanel, Canvas e DockPanel (ma anche altri) ereditano una serie di eventi del Mouse e della Stilo da UIElement come MouseDown, MouseUp, etc.. che però in genere non ricevono (vengono ricevuti solamente dagli elementi figli tramite il bubbling o il tunneling). Ad esempio il seguente codice XAML con la relativa funzione non scatenerà mai l’evento e di conseguenza la MessageBox alla pressione del mouse. La documentazione della Grid purtroppo non ci è di grande aiuto per risolvere la situazione ma all’interno della documentazione della classe base Panel troviamo la risposta: Gli elementi Panel non ricevono eventi del mouse o dello...

Grafici con WPF e LINQ

Aggiornato l’articolo su come creare grafici partendo da zero tramite WPF e LINQ per includere alcune nuove peculiarità del .NET Framework 4.0. Testo più chiaro con TextOptions.TextFormattingMode="Display" ...

WPF e il 3D (ottava parte) – Cubo multi-texture da codice

Indice degli articoli su WPF e il 3D Nel precedente articolo abbiamo visto come creare un cubo multi-texture (ovvero con materiali diversi su ogni faccia) utilizzando esclusivamente XAML, il risultato era un codice abbastanza prolisso e poco riutilizzabile. Realizziamo ora un componente che sia semplice da utilizzare, alla fine dovremmo poter scrivere solamente il seguente codice XAML: NB: Per poter aggiungere alle proprietà il supporto al Binding dobbiamo utilizzare nel componente le Dependency Property Il MultiTexturedCube essendo un oggetto 3D per poter essere visualizzato dovrà essere inserito tra i Children (di tipo Visual3D) di un...

Visualizzare al volo un array in una griglia

I controlli griglia di Windows Forms (DataGridView) e WPF (DataGrid) non permettono di visualizzare “al volo” correttamente insiemi di elementi di tipi come int, float, string, etc.. perché non espongono il loro valore come una proprietà. Il seguente codice per esempio int[] myArray = new int[] { 1, 2, 3 }; dataGrid1.ItemsSource = myArray; mostrerà solamente una griglia con tre righe vuote. Una lista di elementi di tipo string invece visualizzerà nella griglia solamente le lunghezze delle stringhe ma non il loro contenuto proprio perché la prima proprietà della classe string è Lenght. Molto spesso però la necessità è di visualizzare l’effettivo testo della stringa. Per...

WPF e il 3D (settima parte) – Cubo multi-texture

Indice degli articoli su WPF e il 3D Nel precedente articolo abbiamo visto come colorare un oggetto 3D ed abbiamo trattato le problematiche di mappatura con oggetti 2D chiamati texture. In questo articolo prendiamo invece in considerazione l’applicazione di più materiali, uno per faccia, ad un unico modello 3D: in questo caso un cubo che abbiamo già visto come creare. WPF permette di associare ad ogni GeometryModel3D un solo materiale per la vista frontale ed un solo materiale per la vista di retro, per superare questa limitazione possiamo seguire diverse strade: - Creare una...

Massimizzare le finestre sopra la Barra delle applicazioni in Windows 7

In Windows XP esisteva nelle Proprietà della barra delle applicazioni e del menù Start un’opzione chiamata Sempre in primo piano che poteva essere deselezionata e permetteva alle applicazioni massimizzate di poter essere davanti anche alla barra delle applicazioni. Windows Xp Windows 7 In Windows 7...

WPF 3D Labs

Imparare la teoria del 3D è certamente interessante ma quello che serve maggiormente è la pratica. Inauguro una nuova sezione del blog che verrà mano a mano arricchita con nuovi laboratori interattivi dove sarà possibile “smanettare” concentrandosi sul 3D anziché sui dettagli. Non dovrete creare nuovi progetti o pensare a creare assi virtuali per orientarvi nel mondo 3D. Potete imparare i principi fondamentali da subito senza tanti fronzoli e direttamente dal vostro Browser! (richiede installato il .Net Framework 3.5) Ogni laboratorio contiene una piccola descrizione, un link che porta ad un articolo di approfondimento e un tutorial interattivo che spiega passo passo...

WPF e il 3D (sesta parte)

Indice degli articoli su WPF e il 3D I pennelli di WPF Per colorare un cubo di Rosso abbiamo assegnato al nostro modello 3D (creato in precedenza) il materiale DiffuseMaterial con la proprietà Brush impostata a Red tramite codice XAML. Così facendo dietro le quinte è stato utilizzato il pennello predefinito Brushes.Red che altro non è che un Brush (parola che in italiano si può tradurre letteralmente in pennello) di tipo SolidColorBrush (colore uniforme) con la proprietà Color impostata su Red. Avremmo potuto scrivere anche il seguente codice XAML per ottenere lo stesso risultato: Scrivendo il codice in quest’ultima forma è possibile sostituire il...

WPF e il 3D (quinta parte)

Indice degli articoli su WPF e il 3D Dopo aver acquisito manualità con triangoli e quadrati nello spazio 3D è giunto il momento di creare una geometria che renda finalmente “giustizia” al 3D, costruiremo un cubo e aggiungeremo al nostro programma la possibilità di navigare all’interno dello spazio tridimensionale ingrandendo/rimpicciolendo e ruotando la scena col mouse.   Costruiamo un Cubo Come visto nel precedente articolo per costruire un quadrato occorrono 2 triangoli, in un cubo sono presenti 6 quadrati (uno per ogni faccia) ma non serviranno 6x4=24 punti distinti ma solamente 8 punti visto che molti...

WPF e il 3D (quarta parte)

Indice degli articoli su WPF e il 3D Dopo aver visto alcuni concetti fondamentali passiamo alla costruzione di geometrie più complicate per realizzare applicazioni più interessanti.  Il nostro scopo finale è costruire un Cubo di Rubiks che può essere visto come un insieme di 27 cubi ma abbiamo scoperto negli articoli precedenti che l’elemento base del 3D è il triangolo. Vedremo in questo articolo come costruire attraverso dei triangoli dei quadrati che ci serviranno per realizzare dei cubi con cui realizzeremo il nostro progetto. Costruiamo un Quadrato Per poter creare un quadrato occorrono due triangoli (come abbiamo visto l’elemento fondamentale della grafica 3D è...

WPF e il 3D (terza parte)

Indice degli articoli su WPF e il 3D Precedentemente abbiamo definito i punti per costruire un triangolo, vedremo ora come visualizzarlo nella nostra applicazione.   A teatro con.. WPF Come al teatro, la nostra scena tridimensionale avrà bisogno di un, seppur virtuale, palcoscenico. In WPF è rappresentato dal contenuto del controllo Viewport3D che rappresenta per l’appunto il nostro teatro. Se non vogliamo però che la scena resti buia dovremmo aggiungere delle luci. In WPF una luce è una classe derivante dalla classe astratta Light. La luce più comunemente usata è AmbientLight che permette di ottenere un’illuminazione uniforme e proprio per questa caratteristica è la...

Imparare WPF da applicazioni reali

Una domanda spesso ricorrente è come imparare Windows Presentation Foundation (WPF). UPDATE: Un ottima risorsa in italiano per avere una panoramica di WPF e superare gli scogli iniziali, un vero e proprio MUST da vedere per gli sviluppatori provenienti da Windows Forms, sono i webcast (videolezioni) di Corrado scaricabili gratuitamente dal sito BE IT. Lezioni dal taglio pratico e conciso che partendo dalle basi si addentreranno nelle migliori pratiche da seguire per evitare gli errori più comuni fino ad arrivare a spiegare il pattern Model-View-ViewModel per strutturare al meglio le proprie applicazioni. Consigliate anche ai più esperti.   Oltre a leggere i principali libri...

WPF e il 3D (seconda parte)

Indice degli articoli su WPF e il 3D Prima di addentrarci nella realizzazione del nostro Cubo di Rubiks tridimensionale diamo uno sguardo alle basi del 3D partendo dalla creazione di triangoli nello spazio con WPF. Precedentemente abbiamo detto che i punti, nel sistema di coordinate 3D, sono rappresentati da strutture di tipo Point3D. Per poter utilizzare le classi e le strutture relative al 3D nel nostro codice dobbiamo assicurarci di aver definito il namespace System.Windows.Media.Media3D tramite l’istruzione using: Creare un punto e definirne le coordinate (di tipo double) è semplice grazie al costruttore della struttura Point3D: NB: Il punto verrà solamente creato in memoria...

WPF e il 3D (prima parte)

Indice degli articoli su WPF e il 3D Una delle grandi novità del .NET Framework 3.0 è Windows Presentation Foundation (WPF). Inizialmente usato da pochi coraggiosi programmatori, con l'avvento del .NET Framework 3.5 e del successivo SP1 è diventato un ambiente più maturo ed  imparare ad utilizzarlo sta diventando un must se non si vuole perdere il “treno della tecnologia”. Vedremo in questa serie di articoli come e quando utilizzare le sue capacità grafiche 3D sviluppando passo passo un cubo di Rubiks programmabile in 3D.   Halo 4 in WPF? Il supporto grafico 3D di WPF non è pensato per videogiochi all’ultimo grido o per altri...

Grafici con WPF e LINQ

Un problema molto comune durante lo sviluppo di applicazioni è la visualizzazione dei dati. Windows Presentation Foundation non fornisce grafici già pronti e sebbene esistano diversi controlli gratuiti di terze parti vedremo passo passo come costruirne uno “from scratch” (da zero). Leggi l'articolo completo

Il controllo PasswordBox di WPF? Ecco come ti svelo la password e come la proteggo nel VisualTree

Windows Presentation Foundation introduce un nuovo controllo per l’immissione delle password ma purtroppo, come per il TextBox Win32, non è troppo complicato svelare la parola magica nascosta sotto gli asterischi. Il metodo più veloce consiste nell’analizzare il VisualTree (l’albero visuale dei controlli) tramite Snoop ed andare a leggere direttamente la proprietà Password del controllo.   In pochi secondi la password può così essere trovata ma possiamo rendere la vita più difficile ad occhi indiscreti con poche righe di codice. Innanzitutto come possiamo nascondere un valore di una proprietà da Snoop? Snoop visualizza sia le proprietà di dipendenza sia le proprietà CLR ma noi creeremo una...

Snoop e l’applicazione scomparsa

Mi sono sempre chiesto come mai Snoop non riconosca Visual Studio come applicazione WPF, Cider (il designer WPF di Visual Studio 2008) è scritto in buona parte in WPF quindi Snoop dovrebbe riconoscerlo come tutti gli altri programmi WPF. A prova della considerazione che Cider è scritto in WPF ho analizzato Visual Studio con Perforator (un programma che aiuta a misurare le prestazioni di applicazioni WPF). Attivando “Draw Software rendering with purple tint” vengono evidenziate in viola le zone che utilizzano il rendering Software di WPF.   Oggi studiando i sorgenti di Snoop ho trovato la soluzione all’enigma: In effetti Visual Studio non...