2013-08-06 21 views
6

ogólny problemSplitContainer panel Resize Issue

Aplikacja jest C# .NET WinForms 4.0.

Mam SplitContainer, który zajmuje większą część formularza, jest ustawiony na Anchor we wszystkich kierunkach, więc ponownie rozmiar wraz z formularzem. Lewy panel (Panel1) ma proste menu, tutaj nie ma problemów. Prawy panel (Panel2) jest bardziej złożony i zawiera wiele zagnieżdżonych elementów sterujących tabulaturami (z dużą ilością kontrolek) - jest boleśnie skomplikowany, ale się nie zmienia.

Problem polega na tym, że zmiana rozmiaru formularza nie działa tak dobrze. W rzeczywistości, jeśli zmieniasz rozmiar przeciągając krawędzie powoli, to działa dobrze, ale przeciągnij szybko lub użyj przycisku "przywróć" (w prawym górnym rogu formularza), a następnie pojawia się problem.


moją kontrolą Hierarchia

Poniżej znajduje się prosty przykład mojej hierarchii sterowania, jego zdecydowanie obniżyć wersji, ale ma podkreślić zagnieżdżony kontrolę zakładki, które mogą pomóc w replikacji:

  • Formularz
    • Podział kontenerów (anchor: góra, lewo, dół, prawo)
      • SC Panel1 (min Szerokość: 300)
        • TreeViewControl (zapomnieć jak to się nazywa)
      • SC Panel2
        • panel (anchor: góra, lewo, dół, prawo)
          • Sterowanie zakładkami (zakotwiczenie: u góry, po lewej, u dołu, po prawej)
            • Sterowanie zakładkami w/wiele stron, które przepełniają ekran i wymagają przycisków nawigacji do wyświetlenia p prawy narożnik (anchor: góra, lewo, dół, prawo)

Debug Szczegóły

Po pewnym debugowania to wydaje się, że w rzeczywistości jest to Panel2 (element podrzędny podzielonego kontenera), który nie zmienia rozmiaru poprawnie, a sam plik SplitContainer zmienia rozmiar w porządku.

Oto wartości debugowania, które pokazują to ...

pełnej formie szerokość przed zmianą rozmiaru:

splitContainerMain.Width: 1479 
splitContainerMain.Panel2.Width: 1206 
panelCenter.Width: 1203 
tabControlMain.Width: 1215 

Wszystko zgodnie z oczekiwaniami, splitContainerMain.Panel2.Width jest mniejszy niż splitContainerMain.Width.

Po zmianą rozmiaru, gdzie występuje problem:

splitContainerMain.Width: 815 
splitContainerMain.Panel2.Width: 1206 
panelCenter.Width: 1203 
tabControlMain.Width: 1215 

Jak można zauważyć, splitContainerMain.Width został zmieniony zgodnie z oczekiwaniami, ale splitContainerMain.Panel2.Width a następnie jej dzieci nie mają.

UWAGA: Proszę pamiętać, szerokość aktualizacje poprawnie jeśli ręcznie zmienić rozmiar formularza powoli - to nie jest problem ze mną nie poprawnie ustawiania żadnych kotwic.


moich wysiłków So Far

Zastanawiam się, czy problem jest related to this problem here, ale nie jestem przygotowany, aby utworzyć nową „MySplitContainer”, aby spróbować rozwiązać ten problem.

Próbowałem użyć różnych zdarzeń zmiany rozmiaru formularza i spróbować ustawić szerokość ręcznie, ale bezskutecznie. Myślę, że chciałbym spróbować ustawić wartość Panel2.Width z jakiegoś zdarzenia.


Co ja szukam

  • Czy mimo to wymusić splitContainerMain.Panel2.Width prawidłowego rozmiaru, gdy zmiany splitContainerMain rozmiar?
  • Alternatywnie, w jaki sposób mogę obliczyć wartość Panel2.Width? I jak mogę ustawić tę wartość ze zdarzenia Form.Resize? (lub inne zdarzenie?)
+0

starałem się ułożyła formę do przetestowania, ale Jeszcze nie widziałem złego zachowania, jak opisałeś. Jeśli możesz podać więcej szczegółów układu, to pomogłoby to. Ale w przeciwnym razie nie będę miał dużo szczęścia, odtwarzając twoje wyniki. – DonBoitnott

+0

@DonBoitnott: Dodałem trochę szczegółów na temat mojego układu, wiem, że to nie będzie łatwe do zreplikowania, ale być może coś zrobi. Zobaczę, czy mogę zreplikować w nowej aplikacji WinForm też: – musefan

+0

Co to jest 'panelCenter'? A jak zmieniasz rozmiar ... w kodzie? ... po prostu przeciągając krawędź formy? – DonBoitnott

Odpowiedz

0

Z tego, co widzę, należy ustawić kotwicę na brak dla elementów sterujących, które powodują problemy, w tym paneli z podziałami.

Proponuję również użyć właściwości wypełnienia doków, aby najlepiej wykorzystać podziały.

Jeśli potrzebujesz dodatkowej pomocy, proszę dostarczyć plik projektanta, aby mógł wyglądać lepiej.

-2

Dokładnie ten sam problem, poniżej kod pracował dla mnie:

  1. Surround splitContainer w panelu "tableBorder"

Na tableBorder

Dock = DockStyle.Fill; 

Na podzielonym kontenerów, (nie zakotwiczenie)

Dock = DockStyle.None; 
  1. Na tableBorder imprezy SizeChanged

    private void tableBorder_SizeChanged(object sender, EventArgs e) 
    { 
        new Thread(() => { resizeMe(); }).Start(); 
    } 
    
    private void resizeMe() 
    { 
        Thread.Sleep(100); 
    
        this.BeginInvoke((Action)(() => { 
    
         doIt(); 
    
        })); 
    } 
    
    private void doIt() 
    { 
        splitContainer.Height = tableBorder.Height; 
        splitContainer.Width = tableBorder.Width; 
    } 
    

Istnieje małe opóźnienie, ale działa