2010-02-01 1 views
19

Ho uno strano problema relativo al dimensionamento automatico di un pannello in un controllo utente. Questo pannello è ancorato su tutti e 4 i lati del controllo utente. Ma l'ancoraggio non funziona sempre come dovrebbe:C#: il pannello ancorato non verrà ridimensionato correttamente

Se il controllo utente viene ridimensionato ridimensionando il modulo, gli ancore destro e inferiore non funzionano. Ma se il controllo viene ridimensionato utilizzando uno splitter che è nella forma, funziona correttamente. Tutti gli altri controlli che sono interessati dal ridimensionamento funzionano correttamente, solo questo pannello non funzionerà.

Non riesco a vedere la differenza tra il ridimensionamento attraverso uno splitter e un modulo.

L'impostazione manuale delle dimensioni in OnResize di UserControl funziona solo se il ridimensionamento viene eseguito spostando lo splitter. Se il ridimensionamento si verifica ridimensionando il modulo, l'altezza e la larghezza del pannello non cambieranno ai nuovi valori.

Modifica: per rendere più chiaro: il controllo utente viene aggiunto a una TabPage e impostato su Dock = DockType.Fill.

Edit2: Per rendere più complicato: Questa è la gerarchia il controllo viene utilizzato: Il modulo contiene uno splitter con 2 comandi (A e B). (B) contiene un controllo utente (C) con splitContainer. Il contenitore diviso-> panel1 in (C) contiene un controllo tabulazione (D). Questo tabcontrol (D) contiene un controllo utente (E) (in una pagina di tabulazione). Questo controllo utente (E) ha uno splitcontainer (F) in cui è posto un altro controllo usc con un tabControl (G). Questo tabcontrol (G) ha tabpage e in queste pagine è posizionato il controllo utente (H) descritto.

Se posiziono il controllo (H) direttamente sul pannello nel contenitore di suddivisione (C), tutto funziona correttamente. Dal momento che tutti i controlli aggiunti a uno split container o una tabpage sono impostati su docktype = fill, non riesco a capire perché l'ultimo controllo abbia questo problema.

Esiste qualche limite nel framework Windows Form che limita la quantità di controlli figlio?

Modifica: Ho caricato una TestApplication con cui è possibile riprodurre questo problema. http://rapidshare.de/files/49092516/TestApplication.zip.html Si verifica solo in Vista. Win XP e 7 funzionano correttamente ... Se si ridimensiona il modulo, la casella di testo con il pulsante "..." non verrà ridimensionata, ma se si ridimensiona tramite splitContainer verticale, funziona.

+2

Potrebbe incollare il codice codice generato dal progettista (dove si collega tutti i controlli insieme)? La mia prima ipotesi è che il tuo pannello sia ancorato a un controllo diverso da quello che pensi (ad esempio uno dei pannelli della divisione) – Grzenio

+0

Sarebbe troppo codice da incollare, ma ho controllato l'ancora più di una volta ed è impostato correttamente (che è dimostrato da un ridimensionamento funzionante quando si utilizza lo splitter) –

risposta

35

C'è un bug con nidificazione profonda in cui il kernel esaurisce lo spazio di stack, causando il ridimensionamento, l'ancoraggio e l'ancoraggio in caso di malfunzionamento.

Vedi http://support.microsoft.com/kb/953934

+0

Questa è la soluzione. Grazie mille! –

+0

Fantastico. Stavo avendo questo problema esatto me stesso. Grazie. –

+0

Onestamente, non avevo alcuna speranza di trovare una soluzione a questo problema. Grazie. –

2

Hai parlato sia di "anchor" che di "dock", che possono servire a scopi simili ma agire diversamente. Il tuo problema potrebbe essere che stai provando a fare entrambe le cose, e questo sta interferendo con il comportamento che desideri. Altrimenti, forse prova a passare dall'uno all'altro.

Sembra che tu abbia ricontrollato l'ansecer del controllo, ma lo hai esaminato con: Visualizza-> Altre finestre-> Struttura del documento (uno strumento molto utile che ho scoperto solo di recente)?

Infine, anche se non risolve direttamente il problema, sembra che tu abbia un'interfaccia utente molto complicata, e i tuoi utenti potrebbero trarre vantaggio se dovessi dedicare del tempo a considerare la possibilità di semplificare l'interfaccia utente. Naturalmente, non conosco i tuoi utenti o lo scopo dell'app e quello che hai potrebbe essere il migliore, ma sembra che potrebbe essere il momento di porre questa domanda.

Buona fortuna.

+0

Grazie per il suggerimento con la finestra del profilo del documento, è molto utile. Ma a causa del problema non si verifica solo nell'applicazione esterna, ma anche nella semplice applicazione di test non riesco a capire perché dovrebbe essere un problema con l'ancoraggio e l'ancoraggio misti. Ma controllerò questo. Per quanto riguarda l'interfaccia utente: Nell'applicazione di test sembra strano, ma c'è una parte dinamica nell'applicazione reale e alcuni elementi potrebbero essere nascosti. È approvato molto utile dai nostri clienti;) –

1

Il problema non è la profondità di annidamento; i controlli possono essere annidati arbitrariamente in profondità. Ancoraggio e ancoraggio generalmente non giocano bene tra loro.Di solito preferisco l'ancoraggio all'ancoraggio, ma, qualsiasi soluzione scegliate, dovreste probabilmente evitare di mescolarli.

+0

Ho provato diverse possibilità con l'ancoraggio e l'attracco, ma sfortunatamente questo non ha aiutato. Sembra che debba essere un bug nel framework ... –