Le nuove finestre WPF sono ottimamente strutturate, ma ciò crea apparenti rigidità per chi inizia. In particolare nelle vecchia Win Form pulsanti & C. si collocano ovunque sia pure con posizioni assolute, mentre con le pur evolute WPF, che offrono la proprietà Margin, di tipo relativo, è meno semplice farlo... Io non mi vergogno di confessarlo!
PROBLEMA TIPICO. Voglio una griglia (Grid) con vari oggetti nelle sue "celle" seguita, sotto, da una serie di pulsanti per elaborarli. L'idea cui tutti pensano è creare un contenitore "babbo" di tipo StackPanel, i cui figli siano la Grid e i pulsanti predetti. OK se ne bastano un paio che PER DEFAULT VENGONO ACCATASTATI l'uno sull'altro IN VERTICALE. Però, salvo segreti di non immediata comprensione:
a) non sembra possibile collocarli in orizzontale (ciò coinvolgerebbe la Grid, credo sia questa la causa del rigetto);
b) men che meno disporre DUE file di pulsanti, disposti orizzontalmente in ciascuna fila.
By the way, porre pulsanti in più righe aggiuntive della Grid crea altri problemini, tipo colonne inadeguate, difficoltà a inserire linee divisorie che INCLUDANO tutte le "celle" ma ESCLUDANO le righe aggiunte...
Io speriamo che me la cavo (intanto proseguo con aspetti APPLICATIVI che mi interessanto molto di più) ma un TUTORIAL ORGANICO in merito sarebbe gradito assai. Per beginner ma anche per chi è "in mezzo al guado". As I am.
UNA PRIMA SOLUZIONE: DOCKPANEL ANZICHE' STACKPANEL
Nella sostanza, il contenitore StackPanel non è il più adatto allo scopo, che consiste - ripeto - in un Grid a molte righe e colonne nelle cui "celle" sono poste TextBox e Label, ottenendo una (essenziale) matrice ben visualizzata e, insieme, abbastanza agevole da trattare con codice, questo lanciato da pulsanti.
Lo StackPanel è d'uso più immediato ma presenta rigidita:
- i pulsanti, se esterni alla Grid, si possono solo allineare in orizzontale aut verticale con la griglia;
- non ammette oggetti Grid multipli al suo interno...
La soluzione intravista nel post cui rispondo da solo prevede di usare righe extra nella Grid, destinate ai pulsanti, che così, se numerosi, si possono disporre in più file. Ciò non va sempre bene, perché la Grid prevista per i dati non si adatta bene ai pulsanti.
IL CONTENITORE GIUSTO è il DockPanel, perché consente di affiancare alla Grid diciamo primaria (dei dati) fino a quattro Grid, collocabili ai quattro lati della Window, mediante <Grid DockPanel.Dock ="..."> con Top, Left, Rigth e Bottom al posto dei puntini. Nel caso in esame le scelte più logiche saranno Bottom e Top.
Ed ecco uno schema possibile, coi pulsanti collocati in una griglia al Top:
<DockPanel LastChildFill="True" >
<Grid DockPanel.Dock="Top">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="200*" />
<ColumnDefinition Width="200*" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="30*" />
<RowDefinition Height="30*" />
</Grid.RowDefinitions>
<Button Name="btnAvvio" Grid.Row="0" Grid.Column="1" Margin="0,10,10,10">
Simulazione
</Button>
<Button Name="btnFine" Grid.Row="0" Grid.Column="2" Margin="0,10,10,10">
Aggiorna valori
</Button>
<Button Name="btnElab1" Grid.Row="1" Grid.Column="1" Margin="0,10,10,10">
Simulazione
</Button>
<Button Name="btnElab2" Grid.Row="1" Grid.Column="2" Margin="0,10,10,10">
Aggiorna valori
</Button>
La precedente griglia superiore, con due colonne e due righe di dimensioni diverse rispetto alla griglia dati colloca due pulsanti nella prima riga e due nella seconda.
Segue la Grid dei dati, che dovrebbe commentarsi da sola, seguita dalla chiusura </DockPanel>:
</Grid>
<Grid Width="420.084" Height="557.5">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="95*" />
<ColumnDefinition Width="49.995*" />
<ColumnDefinition Width="78.179*" />
<ColumnDefinition Width="2*" />
<ColumnDefinition Width="95.743*" />
<ColumnDefinition Width="2*" />
<ColumnDefinition Width="95*" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="25*" />
eccetera x n Righe in totale
</Grid.RowDefinitions>
<Label HorizontalAlignment="Center" Content ="Valori:" />
<TextBox Name="Squad1" Grid.Row="1" Grid.Column="0" Background="LightBlue">
Primo Dato
</TextBox>
eccetera, per altre Label e TextBox come occorre
</Grid>
</DockPanel>
GIANNI GIACCAGLINI
giannigiac@tin.it