2012-02-01 13 views
5

It appears che il numero massimo di adorners che funzionano senza alcuna rottura è 144.Utilizzando più di 144 adorners

Ho uno ScrollView con un gruppo di oggetti, e molti di essi sono dotati adorners. I primi 144 decoratori sono posizionati correttamente, ma il resto no. Si noti che è una situazione eccezionale quando ce ne sono così tanti; di solito ci sono esattamente zero decoratori. Tuttavia, mi piacerebbe che funzionasse correttamente anche in quell'occasione eccezionale.

Lasciando da parte come questo limite arbitrario (e molto basso) mi fa sentire, ci sono degli aggettivi pratici per questo bug?

+0

Se le posizioni del postino sono animate, la domanda potrebbe essere correlata a [questa domanda] (http://stackoverflow.com/questions/9049610/is-141-the-maximum-number-of-wpf-panel-items -che-può-essere-animato-contemporaneamente/9062419 # 9062419). Ho notato 144 come il numero massimo di trasformazioni animate (in determinate condizioni) lì. – Clemens

+0

C'è anche [questa domanda] (http://stackoverflow.com/questions/7610608/onrender-method-does-not-work-with-more-than-144-controls) che viene eseguito anche nel numero magico 144.I miei non sono animati direttamente, ma sono collegati ai controlli che scorrono avanti e indietro. –

risposta

3

In questo momento non esiste un modo noto per farlo.

Che è altrettanto buono, perché ho trovato la prestazione di essere poveri; semplicemente sottoclassi il mio controllo Image che doveva visualizzare l'adorner, e disegnare la sovrapposizione nel OnRender, funzionava molto meglio (e a differenza di WinForms, il visual può estendersi oltre il limite logico del controllo).

0

Questo potrebbe essere molto tardi per la festa qui, ma questo sembrava risolvere il problema per me. Ho tenuto un elenco degli elementi decorativi che avevo aggiunto al layer adorner (chiamato m_adorners) e nel controllo root in cui erano contenuti i miei adorners, collego all'evento LayoutUpdated. Ecco gestore di eventi:

private void OnLayoutUpdated(object sender, EventArgs e) 
    { 
     if (m_adorners.Any(a => !a.IsArrangeValid && 
       a.Parent != null)) 
     { 
      AdornerLayer adornerLayer = AdornerLayer.GetAdornerLayer(this); 
      adornerLayer.InvalidateArrange(); 
     } 
    } 
2

Ecco lo scenario in base al quale sono riuscito a implementare un allenamento per questo problema:

Ho un certo numero di caselle di testo che sono collegati a un documento di Excel. Le caselle di testo assumono un valore numerico. Sono impostati per invalidare gli errori di dati nel codice xaml. Si verifica un errore di dati se il numero è < 1 o null. Ho posizionato un AdornerDecorator attorno alla casella di testo (in modo che il bordo di invalidazione rosso appaia correttamente sulla casella di testo). In Excel, è possibile modificare tutte le caselle di testo contemporaneamente - ma, come rilevato dall'OP, se si riesce a invalidare oltre 144 caselle di testo contemporaneamente, il decoratore decoratore inizia a giocare, compensando la posizione dei bordi (lo stesso cosa è stata progettata per risolvere in primo luogo).

Ho provato un numero di soluzioni diverse tra cui invalidare il layout, tuttavia nessuno di questi ha funzionato per la situazione che stavo affrontando. Usando Snoop, ho scoperto che se aggiornassi manualmente la casella di testo, l'adornatore si posizionava correttamente. Così, ho deciso di chiamare un aggiornamento del layout da ogni singola casella di testo che necessitava dell'ornatore. Ho fatto questo ascoltando OnValueUpdated sulle caselle di testo. Se il nuovo valore che si stava aggiornando era un valore non valido, imposto un "UpdateLayout()" per la casella di testo (volevo farlo solo per valori non validi, perché forzare un aggiornamento ha un impatto sulle prestazioni e non voglio fallo ogni volta che cambia il valore).

In questo modo, indipendentemente dal numero di celle che volevo cambiare in una volta, il decoratore decoratore veniva sempre visualizzato nella posizione corretta (eccetto per l'ultima casella di testo da valutare che, nonostante i miei migliori sforzi, è sempre mai così lievemente disallineato).

Problemi correlati