2010-04-06 12 views
5

Sto provando a creare un pannello semplice che contenga un bambino e lo farà scattare alle dimensioni della griglia più vicine. Sto avendo difficoltà a capire come farlo superando MeasureOverride e ArrangeOverride.Hai bisogno di aiuto per capire WPF MeasureOverride e ArrangeOverride infinity e 0 size

Ecco cosa sto cercando: Voglio che il mio pannello dica al suo proprietario che (a) vuole essere il più grande possibile, quindi (b) quando scopre di quale dimensione è, si dimensionerà e il suo UIElement figlio secondo il punto di snap più piccolo più vicino. Quindi, se stiamo eseguendo lo snap a 10, e posso trovarmi in una regione non più grande di 192x184, il pannello dirà al contenitore principale "la mia dimensione effettiva sarà 190x180". In questo modo tutto ciò che si trova al limite del mio controllo sarà in grado di allinearsi ai suoi bordi, al contrario dello spazio potenziale.

Quando inserisco il pannello in una griglia, ottengo 0 o PositiveInfinity (dimentico) per la dimensione in entrata negli override, ma quello che devo sapere è "quanto può essere grande il mio spazio?" non infiniti ..

Parte del problema penso sia ciò che WPF considera i valori magici di PositiveInfinity e 0 per la dimensione. Ho bisogno di un modo per dire, tramite MeasureOverride "Posso essere grande quanto mi concedi" e in ArrangeOverride per ridimensionare effettivamente le dimensioni dello snap.

O sto andando in questo modo completamente sbagliato? Misurare e organizzare sembra molto complicato, solo vagando un po 'nel codice per i pannelli standard in Reflector.

risposta

5

Nella fase di misura, se WPF ti invia infinito, devi dire quanto grande vuoi essere. Se invia 0, non c'è letteralmente spazio per il layout. Nella fase di organizzazione, ti verrà detto quanto spazio è disponibile per il layout, che è molto probabile che sia diverso dalla dimensione che ti è stata data nel passaggio di misura. Non puoi restituire l'infinito in nessuno dei due passaggi. Il seguente codice dovrebbe realizzare ciò che si sta cercando (si noti che sto assumendo una proprietà UIElement Child):

protected overrride Size MeasureOverride(Size availableSize) 
{ 
    Child.Measure(availableSize); 
    return Child.DesiredSize; 
} 

protected override Size ArrangeOverride(Size finalSize) 
{ 
    int w = (((int)finalSize.Width)/SnapPrecision) * SnapPrecision; 
    int h = (((int)finalSize.Height)/SnapPrecision) * SnapPrecision; 

    Child.Arrange(new Rect(0, 0, w, h)); 
    return new Size(w, h); 
} 
Problemi correlati