Per prima cosa, impostare il bind Fill in Mode = OneWay. Scommetto che non hai bisogno che sia TwoWay e potrebbe essere il defalt nel tuo setup. I binding TwoWay costano molto di più.
In secondo luogo, si consideri l'utilizzo di una versione sempre più dura: Mode = OneTime. Dal momento che è improbabile che le icone cambino, non è necessario alcun monitoraggio delle modifiche. Questo ti farà risparmiare ancora più risorse.
Nel tuo caso, First + Second probabilmente non ti darà una grande spinta, ma vale la pena provare e ricordare.
In terzo luogo, che ne dici del tuo VisualBrush
es? Tutti usano lo stesso Visual="{StaticResource appbar_zune}"
? Allora perché crei migliaia di istanze? Invece di incollare la copia, crea solo un'istanza e fai in modo che tutti gli elementi utilizzino quella istanza. Puoi risparmiare molto tempo e memoria.
In quarto luogo, e più importante e di solito la massima velocità, è - hai tonnellate di articoli. Scommetto che hai qualche scorrimento, orizzontale o verticale. Ma come generi e visualizzi quella pila di oggetti? La creazione di ALL ALL una volta è .. sprecante. Non si adattano tutti sullo schermo, giusto?
Avete alcuni ItemsControl che generano migliaia di elementi? Esaminare la proprietà ItemsPanel
di ItemsControl e attivare l'opzione virtualizing
su quel pannello. Questo farà sì che si colleghi alla barra di scorrimento e inizierà a creare dinamicamente solo quegli elementi che sono sullo schermo e distruggendo oggetti che si spostano fuori dallo schermo. Beh, l'ho semplificato eccessivamente, ma lascia che funzioni così. Si noti che contenitori come ListBox
(e molti altri) è anche un oggetto ItemsControl, quindi si applica anche qui.
O forse hai un enorme file XAML con migliaia di controlli all'interno di alcuni StackPanel
senza ItemsControl? Non è davvero saggio. Ma vabbè .. puoi ancora accendere virtualization
su StackPanel.
Attivare la virtualizzazione in genere è una buona idea se si dispone di più di poche decine di elementi. È spesso necessario avere un centinaio, ed è un must se si raggiungono migliaia e più. Tuttavia, i costi di virtualizzazione: molto spesso reimposta/reinizializza gli articoli. Se il tuo ItemTemplate è davvero complesso, la virtualizzazione potrebbe far diventare lo scrolling "jaggy/laggy", non so come esprimerlo in inglese, mi dispiace. Il thread del compositore potrebbe semplicemente non avere abbastanza tempo per ricalcolare e ritrasmettere tutti gli elementi in rapido movimento.Se riscontri questo problema, prova a impostare Height
degli articoli su un valore costante fisso immutabile. Aiuta molto a velocizzare il layout. ma se il tuo ItemTemplate è davvero malvagiamente complesso, potrebbe non essere d'aiuto neanche. In questo caso senza uscita, l'unica opzione è ... riprogettare e semplificare il modello dell'articolo.
EDIT:
Naturalmente tutto questo non si guadagna nulla se non si dispone di barra di scorrimento e se si sta cercando di visualizzare una tonnellata di elementi contemporaneamente. In questo caso, cerca di semplificare o rimuovere associazioni, modelli, nidificazione dei componenti (a volte è meglio calcolare le posizioni manualmente che utilizzare tre griglie incorporate), use rendering cache o (...) .. Scusa, inizio a fare troppe ipotesi, troppe opzioni ..
EDIT:
ho appena notato Width="1*"
e Stretch
, quindi probabilmente si dispone di una griglia in alto, non StackPanel. Dal momento che li vuoi uguali, lo UniformGrid
potrebbe avere prestazioni migliori. Inoltre, con un po 'di lavoro è possibile aggiungere la virtualizzazione alle reti, anche:
Oh, e un'ultima parola sulla virtualizzazione: ricordo che quando ScrollView funziona in modalità virtualizzazione, quindi il Position
non è conteggiato in pixel/punti più. In v-mode, la posizione della barra di scorrimento viene contata in items
, ovvero posizione = 2,5 significa che lo scroller è a metà del terzo elemento (2 elementi passati e mezzo più), non a pos = 2,5 "pixel" .
No, 'Visual =" {StaticResource} 'viene generato per ogni tasto icona, quindi' appbar_zune' è solo una di quelle chiavi.Tieni presente che l'intero estratto del codice nella mia domanda (l'intero ' 'tag) è stato generato automaticamente da un codice C# separato leggendo il file' C: \\ Users \\ myAccount \\ MahApps.Metro/MahApps.Metro.Resources/Icons.xaml' e utilizzando la definizione 'x: Key' per generare 1216 varianti di tale tag '' (con logica che gestisce 'Margin',' Grid.Column' e 'Grid.Row'). Quindi non c'è' Binding' in corso. puoi usare 'Binding' per generare' UIElements'? –
@emmanuel: Non direttamente tramite 'Binding', ma indirettamente sì. Questo è ciò che sono componenti come' ContentPresenter' o 'ItemsControl'. Se tu avessi un' List 'con T una classe che conserva tutte le informazioni sull'icona, allora potresti usare ' 'e itemscontrol ti genererebbe un elenco di elementi sincronizzati 1-a-1 in quella lista di fonti. Gli articoli verranno generati in base al ItemTemplate che è necessario impostare su ItemsControl –
quetzalcoatl
@emmanuel: Nell'utilizzo di base, ItemsControl genera tutti gli elementi non appena ottiene i dati dall'associazione.Ma se la virtualizzazione è attivata, genererà solo la parte attualmente sullo schermo, risparmiando potenzialmente molto tempo e memoria. Di default, virt è off, perché costa e non è sempre possibile. – quetzalcoatl