Încerc să adaug un FlowLayoutPanel cu alinierea elementelor de jos în partea de sus.
Nu știu cum să o folosesc deloc sau nu funcționează deloc.
- Care este aceasta -6 care face diferența între lățimea panoului și comenzile din el?
- Pe măsură ce lățimea elementelor scade, lățimea panoului nu scade.
- Căptușeala inferioară este de 2 ori mai mare decât ar trebui să fie.
- Nu există nici o defilare orizontală în cazul în care apare o depășire din cauza umpluturii.
- Acele părți care nu se potrivesc datorită plăcuțelor sunt în afara zonei de defilare. Inclusiv partea de sus.
- Care este aceasta -6 care face diferența între lățimea panoului și comenzile din el?
Această diferență se datorează controalelor imbricate de Margin. Valorile implicite sunt 3px pe toate laturile.
- Pe măsură ce lățimea elementelor scade, lățimea panoului nu scade.
Pentru ca lățimea panoului să schimbe dimensiunea, trebuie să setați proprietatea AutoSize la true. și dacă doriți să fie posibilă nu numai extinderea, ci diminuarea, proprietatea AutoSizeMode este AutoSizeMode.GrowAndShrink.
- Căptușeala inferioară este de 2 ori mai mare decât ar trebui să fie.
- Nu există nici o defilare orizontală în cazul în care apare o preaplină din cauza umpluturii.
- Acele părți care nu se potrivesc datorită plăcuțelor sunt în afara zonei de defilare. Inclusiv partea de sus.
Cu plăcuțe, acest panou funcționează în mod normal numai când se activează AutoSize și este dezactivată funcția AutoScroll. detalii de mai jos.
În cele din urmă trebuie să scriu o actualizare a răspunsului. Deci:
Și dacă este ceva mai precis, atunci toate controalele de la containere au fost moștenite de la ScrollableControl. Pentru cei care doresc să verifice totul și fanii săpe în codul sursă aici. Studiile au fost efectuate pe formele .NET native. În Mono, comportamentul poate fi diferit.
În această problemă, suntem interesați de următoarele proprietăți ale panoului: AutoSize. AutoSizeMode. Autoscroll. Padding. MaximumSize. Dock și influența reciprocă asupra lor, efectul asupra aspectul și comportamentul panoului. La prima vedere, totul este simplu, dar există o serie de gandaci capabili sa indeparteze mult timp si, eventual, nervi.
Să începem cu AutoSize - în conformitate cu documentația, dacă activați această proprietate, dimensiunea controlului va fi ajustată la dimensiunea conținutului său. Acest comportament poate fi controlat într-o anumită măsură utilizând proprietățile MaximumSize și MinimumSize. Cred că nu există explicații. Și, de asemenea, proprietatea AutoSizeMode. care poate lua una din cele două valori: GrowOnly și GrowAndShrink. În primul caz, panoul va crește pentru a afișa tot conținutul, dar nu se va micșora dacă conținutul este mai mic, în al doilea rând, modificarea dimensiunii are loc în ambele direcții. Dacă utilizați și proprietatea Padding. atunci dimensiunea elementului va fi ajustată pentru a se potrivi cu indentarea. Adăugați docul. cu excepția completați și obțineți din nou ceea ce ne așteptăm. Indicii sunt luați în considerare, conținutul este afișat dacă se potrivește în controlul părinte al panoului nostru.
Dacă totul este așteptat - de ce atât de mult text? Dar de ce, încercați să adăugați AutoScrol aici. Dacă nu este setată proprietatea MaximumSize și AutoSize este activată. atunci nu se va întâmpla nimic. În general. Este destul de logic, de ce include scheletul dacă totul se potrivește și așa. Acum vom seta MaximumSize astfel încât conținutul să înceteze să se potrivească, de exemplu, în înălțime. Apare scrolurile de bare și miracole încep. Barele de turnare apar simultan, chiar dacă conținutul se potrivește în lățime, deoarece Bara de derulare verticală atunci când este activată reduce lățimea părții afișate a panoului și conținutul nu mai se încadrează în lățime. Și despre AutoSize. dar nici unul nu știe nimic despre scrolbars și continuă să calculeze lățimea panoului la lățimea conținutului său.
Mai mult miraculos. Se pare că situația poate fi corectată folosind proprietatea Padding. Despre aceasta, AutoSize știe și ia în considerare. Da, puteți, dar numai dacă utilizați, în cazul nostru cu derulare verticală, marginea dreaptă. AutoSize va recalcula dimensiunea cu contul său, iar barela de scroll nu se va suprapune cu conținutul, provocând apariția celei de-a doua bare de derulare și indent dacă mărimea liniei este suficientă. Adăugați marginea din stânga - totul este bine, mărimea calculată din nou corect. Vom adăuga indentarea de jos - nu sa întâmplat nimic, ca și cum nu l-am adăuga. Bine, nu este înfricoșător, bine, indentarea a dispărut și dracu cu ea, conținutul este vizibil și va fi derulat. Adăugați marginea superioară - "Șeful! Totul a dispărut!" Linia este vizibilă, dar exact pe dimensiunea acestei liniuțe conținutul sa mutat în jos și a ascuns nu permite transferul conținutului astfel încât să devină vizibil tot. În consecință, dacă avem o bară de derulare orizontală activă, atunci același efect va fi obținut din aplicarea liniuței stânga. Un alt punct interesant, dacă specificați doar marginea din stânga și dimensiunea este mai mare decât lățimea barei de derulare, linia va fi vizibilă, bara de derulare verticală va suprapune conținutul, dar nu apare bara de derulare orizontală. Lățimea este suficientă pentru a găzdui conținut.
Motivul acestei rușine, așa cum am putut afla din surse (tyk), constă în faptul că, la redimensionarea zonei clientului, sunt luate în considerare numai linii de jos și drept.
Poate că nu am enumerat toate opțiunile pentru un comportament straniu de indentare pe panouri, dar am încercat să dezvăluesc complet esența generală a problemei.
Pentru mine, am găsit odată o modalitate de a obține imaginea dorită, poate fi utilă pentru dvs.
De ce ai nevoie de un panou extern? Aici totul este simplu, dacă utilizați selecția manuală a dimensiunii FlowLayoutPanel. atunci va trebui să reacționați la schimbarea oricăror elemente imbricate și, eventual, adăugarea sau eliminarea elementelor. Pentru un panou extern, trebuie doar să monitorizați modificarea mărimii FlowLayoutPanel.