Domanda Datagrids di WPF e larghezze di colonna dinamiche


Abbiamo un controllo DataGrid personalizzato che genera dinamicamente colonne determinate da una struttura XML.

Quando creiamo ognuna delle colonne, le stiamo assegnando un tipo di unità speciali, perché vogliamo assicurarci che non ci sia mai uno scrolling orizzontale nel DataGrid.

            DataGridTextColumn column = new DataGridTextColumn();
            column.Width = new DataGridLength(entity.DisplaySize, DataGridLengthUnitType.Star);

Tuttavia, abbiamo notato che quando viene eseguito il rendering di DataGrid, esegue il rendering con la dimensione minima assegnata alle colonne, quindi una volta eseguito il rendering completo di DataGrid ridimensiona le colonne per adattarle correttamente all'interno di DataGrid. Ciò sta causando un effetto di sfarfallio.

Qualcuno ha qualche possibile soluzione? Forse come rendere il DataGrid in background, quindi mostrare una volta che le colonne sono state agitate? O altre idee?


12
2017-09-14 16:48


origine


risposte:


Questo è, sfortunatamente, un comportamento normale. Ha a che fare con il modo in cui viene eseguito il controllo. In WPF, hai livelli su livelli di controlli e DataGrid non ha modo di sapere quali tipi di controlli finiscono il rendering.

Quindi il primo passaggio di layout crea i controlli, ma poi deve passare attraverso un secondo passaggio per misurare la dimensione di tali controlli. Una volta che sa quanto sono grandi i controlli, può quindi iniziare a ridimensionare le colonne.

Un DataGrid è un eccellente esempio di uno scenario in cui il sistema di layout altamente configurabile e dinamico di WPF non funziona. Per ottenere il tipo di prestazioni a cui sei abituato, dovrai utilizzare una griglia non WPF, in grado di prevedere meglio la propria gerarchia e quindi eseguire questo tipo di misurazioni senza la necessità di eseguire il rendering preliminare di tutto. Esistono controlli di questo tipo per WPF, ma devi trovarli.

Eccone uno da xceed: http://xceed.com/Grid_WPF_Intro.html?gclid=CNKE8rOBtrICFQfonAodHQ8AEA

Eccone uno da Telerik: http://www.telerik.com/products/wpf/gridview.aspx

(A causa della necessità di bilanciare la flessibilità con le prestazioni e il gran numero di funzionalità previste in un datagrid moderno, questo controllo è stato a lungo considerato l'apice dello sviluppo del controllo .Gli datagrids buoni sono estremamente difficili da costruire. intera applicazione intorno, in sostanza, un datagrid glorificato. Tutto questo per dire, probabilmente non troverai quello che stai cercando gratuitamente.)

Vedi questa domanda: WPF DataGrid Vs Windows Forms DataGridView


3
2017-09-14 21:26



Non penso che stiate facendo il rendering in background. Il modo in cui fa il layout ci sono due passaggi.

Sistema di layout

Mi viene colpito con questo su un clic del pulsante in cui il pulsante è un ListItem. Il pulsante fa sì che alcuni contenuti sopra siano modificati e cambia la posizione del pulsante in modo tale che vi sia un altro pulsante nello stesso punto. L'evento click viene elaborato per il pulsante sbagliato. Quando provo a rompere il codice fino a qualcosa di semplice da pubblicare su SO funziona.

Su DataGrid il modo in cui mi occupo di esso è ListView GridView e calcola la larghezza di ogni colonna.


0
2017-09-14 20:59