Proprietà personalizzata stile listbox

mercoledì 19 marzo 2014 - 19.04
Tag Elenco Tags  VB.NET  |  .NET 4.0

darkeric Profilo | Senior Member

Ciao a tutti

ho creato uno UserControl in WPF (in pratica un gruppo di menu) chiamato GroupBox
e un altro UserControl che ho chiamato Item_Menu (che dovra essere incluso a piacimento nel GroupBox)
ho implementato alcune proprietà classiche
come immagine, intestazione

vorrei che groupBox avesse una proprietà (Items)
che mi permetta dal pannello delle proprietà di aggiungere o rimuovere Item_Menu
che saranno figli di uno stackpanel di GroupBox
come se fosse una combobox o una listbox

per esempio

<local:GroupBox >
<local:Item_menu />
<local:Item_menu />
</local:GroupBox >

non ho idea mi potreste indicare la retta via?

Programmatore per passione!

0v3rCl0ck Profilo | Guru

Ciao, faccio un po' fatica a capire cosa vuoi ottenere, riusciresti a farmi capire cosa ti serve facendomi vedere che cosa vuoi ottenere a livello grafico (anche con uno disegno in paint ), così posso proporti una soluzione valida per il tuo scenario.


Michael Denny
Software Developer & Architect
http://blogs.dotnethell.it/Regulator/
http://dennymichael.wordpress.com
Twitter: @dennymic

darkeric Profilo | Senior Member


1024x768 86Kb


eccola

in pratica il groupbox ha uno stackpanel
che dovrà essere il padre degli item_menu

so che posso farlo da code_behind
ma vorrei imparare a farlo da Xaml
utilizzando le property.


Programmatore per passione!

0v3rCl0ck Profilo | Guru

Eccomi, in generale ti sconsiglio di crearti dei tuoi controlli custom, perchè mentre prima in windows forms era quasi sempre necessario per avere un buon livello di riutilizzo di codice/viste, ora con WPF è esattamente l'opposto, si tende a non creare mai custom control per riutilizzare codice/viste, ma si sfruttano i template e gli style sui controlli predefiniti di WPF, che ti danno il pieno controllo di come i controlli verranno renderizzati, di fatto i controlli WPF sono in grado di ricoprire la maggior parte delle necessità, perchè è un concetto di comportamenti e funzionalità che un controllo da ha disposizione e non è più legato all'aspetto visivo, prima con windows forms le due cose erano fortemente legate, si poteva cambiare qualcosa dello stile di un controllo, ma poca roba, sicuramente non era possibile dare un look & feel completamente diverso a proprio piacimento. Con l'avvento di WPF, questo concetto è cambiato drasticamente, ora la parte più importante di un controllo sono i comportamenti e le funzionalità che implementa, mentre la sua rappresentazione a video è decisamente poco rilevante! Microsoft per ogni controllo ovviamente da una rappresentazione di default, che è il template di default che ogni controllo si porta dietro se non glie ne viene specificato un altro. Il template a volte è la COMPLETA rappresentazione a video del controllo, e a volte solo una parte. Il template di un Calendar ad esempio è fatto da tanti altri controlli base di wpf e di conseguenza il suo template rappresenta esattamente tutto quello che vedi a video, ed è possibile stravolgerlo completamente, mentre ad esempio il template di una textbox rappresenta solo l'involucro che sta attorno allo spazio per digitare, questo perchè il fatto di digitare non sarebbe modificabile e avrebbe poco senso, il senso è potere modificare tutto quello che ci sta attorno, il bordino, vari comportamenti sul focus, ecc... la dimostrazione che i Template sono la rappresentazione a video dei controlli la puoi avere togliendo il template di un qualsiasi controllo, vedrai che lo stesso sparisce:

<TextBox> <TextBox.Template> <ControlTemplate> </ControlTemplate> </TextBox.Template> </TextBox>

vedremo che a video non verrà renderizzato alcuna textbox, mentre con il default template sappiamo tutti come si presenta una textbox.

Detto questo ti ho preparato un esempio in entrambe le salse, un esempio sfruttando controlli custom e dependency property, e l'altro esempio quella che ti consiglierei) sfruttando i semplici controlli di wpf con template opportunamente modificati per rappresentare a video esattamente quello che ti interessa vedere.

I custom control possono essere utili se ti rendi conto che un controllo può essere riutilizzato in più applicazioni e non vuoi portarti dietro semplicemente gli stili, ma direttamente una librerie contenente il controllo completo. Inoltre aggiungerei che comunque un custom control dovrebbe per lo meno aggiungere anche comportamenti nuovi rispetto al controllo che si sta estendendo, e non solo uno stile diverso, perchè per quello rimangono buoni Style + Template, con la possibilità di scambiare Dictionary (che sono come stylesheet per web) tra applicazioni diverse, contenenti gli stili più disperati per ogni esigenza.

Questo è il codice completo della soluzione che preferisco a style + template:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Lo screenshot dell'app di prova:


1000x750 25Kb


Non ho messo le immagini per semplicità, ma è sufficiente impostare la proprietà Header per esteso, nestato nel markup:

<HeaderedContentControl Content="Preventivi"> <HeaderedContentControl.Header> <Image Source="..."/> </HeaderedContentControl.Header> </HeaderedContentControl>

Spero di averti fatto un po' di chiarezza.

Ciao,

Michael Denny
Software Developer & Architect
http://blogs.dotnethell.it/Regulator/
http://dennymichael.wordpress.com
Twitter: @dennymic

0v3rCl0ck Profilo | Guru

Io ti ho fatto l'esempio con il controllo più base che ha un header, ma nel tuo caso specifico dato che è un menu e sarà sicuramente cliccabile ecc... potresti utilizzare anche il controllo Menu e MenuItem che come tutti gli altri controlli puoi estremamente personalizzare. Di default si presenta come un menu classico da posizionare in alto nella toolbar, ed il suo template è moooolto più completo e complesso, ma modificandolo puoi farlo diventare esattamente come quello della tua applicazione, ma con il fatto che i controlli Menu e MenuItem sono più ricchi e hanno più funzionalità che ti possono servire quali le proprietà Command, IsChecked, Header, Icon e altri...

Ti allegato il template di default per comodità...

Menu:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

MenuItem:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

come puoi notare sono particolarmente complessi, ovviamente non devi per forza partire da questi template, ma partire da uno povero, e prendere spunto da quelli di default per agganciare le funzionalità che ti servono.

Ho voluto aggiungerti questa cosa per essere più completo, ma forse cambiare il template al menu è complesso, diciamo che sicuramente puoi prendere spunto per tante cose che magari ti possono servire.


Michael Denny
Software Developer & Architect
http://blogs.dotnethell.it/Regulator/
http://dennymichael.wordpress.com
Twitter: @dennymic
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5