Abbiamo un controllo figlio molto grande che esegue molto rendering per visualizzare i suoi dettagli, ma dal momento che solo una porzione di quel controllo è effettivamente visibile (viene ritagliata da qualcosa più in alto nella gerarchia, non necessariamente dal suo genitore immediato) vogliamo solo per rendere visibile la parte durante la chiamata OnRender.Esiste un modo semplice per determinare i limiti visibili di un controllo per ottimizzare il rendering?
Considerare la figura seguente. Il bambino è 100x50 ma l'area visibile è un rettangolo con angoli a (10,5) e (100,50) in coordinate figlio. Questa è l'area che stiamo cercando.
Nota: Non si può semplicemente fare coordinare le conversioni da parte del bambino al genitore e il test per il ritaglio, perché non può essere il genitore che sta facendo il ritaglio.
Considerare i controlli nidificati Canvas all'interno di ScrollViewer. La tela interna può benissimo giacere completamente entro i limiti della tela esterna, ma la tela esterna può essere ritagliata dal ScrollViewer, quindi anche la tela interna viene ritagliata visivamente da essa.
Camminare nell'albero visivo e testare ogni genitore ucciderebbe le prestazioni.
Quindi c'è qualcosa di integrato in WPF che può ottenere i limiti dell'area visibile di un controllo?
Questo thread potrebbe aiutare a ottenere ciò che si vuole: http://stackoverflow.com/questions/1517743/in-wpf-how-can-i-determine-whether-a-control-is-visible -per-l'-utente –
No! Questo è solo un controllo dei limiti (vedi la mia 'nota' sopra). Questo in realtà non rappresenta ciò che è visibile. – MarqueIV
Solo una pugnalata al buio - usa il reflector per esaminare l'interno della proprietà IsMouseDirectlyOver (che si trova nella maggior parte dei controlli WPF, probabilmente ereditato da FrameworkElement). Quella proprietà guarda attraverso gli oggetti nidificati per determinare se il mouse è direttamente sul controllo specifico esatto. Sto pensando che potresti essere in grado di usare una logica simile per il controllo dei limiti ... – Marko