Il programma che ho creato per l'ultimo anno e mezzo è in C # 4.0 WPF.
Ho un RichTextBox
con un Table
all'interno. All'interno della tabella ci sono colonne e righe diverse a seconda dell'input dell'utente, ma ci possono essere 30k + righe e potenzialmente infinite colonne (anche se sto cercando solo un uso pratico, quindi diciamo solo un massimo di 7 colonne). Quindi guardo ~ 225k TableCell
s. Poiché non conosco un modo migliore per modificare le dimensioni delle colonne in base alle preferenze di runtime dell'utente, ho sovrapposto un Grid
con GridSplitter
s che coincide con le colonne della tabella. Il trascinamento di uno splitter regola la larghezza della colonna della tabella corrispondente.
Nella griglia sovrapposta, ho anche grafici di controllo personalizzati con statistiche che indicano sezioni in ciascuna delle colonne. Ogni colonna può avere più di 50 grafici e ogni sezione che denota il grafico riprende le stesse righe attraverso le colonne. Quindi, se un grafico si trova in una cella della griglia, grafici simili con statistiche diverse si trovano in tutte le celle di quella riga. Le sezioni possono essere tutte di dimensioni diverse in termini di righe e altezza, ma hanno sempre le stesse dimensioni orizzontalmente (attraverso le colonne), ma non verticalmente (attraverso le righe). Nel sottostante Table
, mantengo semplicemente la fila di celle con i grafici vuoti. Il resto della griglia è fondamentalmente trasparente, quindi puoi vedere il TableCell
s sotto.
Così com'è con il numero massimo possibile di componenti (30k + * 7 celle combinate con tutte le righe / colonne aggiunte a Grid
e Table
), ci vogliono secoli per riempire. Ogni TableCell
viene riempito con un singolo Paragraph
contenente Run
s e Span
s che devono essere tutti elaborati e compilati da un string
. Non voglio necessariamente riempirli tutti immediatamente dopo che l'utente ha inserito il loro input a causa dell'enorme quantità di tempo necessario e non so come renderlo virtualizzante, così mi è venuta l'idea di fare un buffer di ordinamento che carica così tanto in base a quanto in basso l'utente ha eseguito lo scroll del ScrollViewer
che comprende sia Grid
che Table
.
Per quanto ne so, deve essere un RichTextBox
a meno che non ci sia un altro modo per essere in grado di selezionare più celle di testo che possono essere modificate / evidenziate / copiate / qualsiasi cosa. Il layout visivo deve rimanere lo stesso (anche se i componenti dietro le quinte differiscono); è solo che non so come altro costruirlo.
Non cerco soluzioni di codice perché sono abbastanza sicuro di riuscire a trovare il codice corretto se ho l'idea giusta per guidarmi, ma sto cercando un'idea migliore di quella che ho appena descritto per fare ciò che devo fare. Ad esempio, c'è un modo per costruire un modello che faccia ciò che utilizza anche la virtualizzazione, così posso legare tutto questo invece di farlo manualmente nel codice? Posso acquisire tutti i record nelle loro strutture e costruire e rendere tutti i grafici in una frazione di secondo. I maggiori colli di bottiglia sono l'aggiunta in tutte le righe e il popolamento delle celle e quindi la ri-misurazione delle altezze (un tale dolore da fare con le celle di tabella rich text ...). Quindi qualcuno ha qualche idea migliore? Domande di cui non ho chiarito le risposte nella mia spiegazione?