none
Steuerelemente werden beim Laden breit und schmaler gezogen RRS feed

  • Frage

  • Hallo zusammen,

    ich habe ein SplitterPanel und in dort im Panel2 weitere Panels und Controls (TextBoxen, ComboBoxen, ..), die jeweils einen Anchor Left und Right haben, damit die beim verbreitern/verkleinern des SplitterPanels dynamisch größer/kleiner werden. Soweit so gut.

    ABER: meine Anwendung wird im Vollbildmodus gestartet und da das SplitPanel auch jeweils mit seinen Anchorn dadurch höher und breiter wird werden die Controls dann auch alle erst mal Breiter gezogen. Am Ende der Form Load-Methode habe ich dann noch die gewünschte Größe der rechten SplitterPanel-Hälfte über die SplitterDistance und dann die minimale Breite der beiden Panels festgelegt.

    Beim Starten der Anwendung sehe ich aber dann erst mal, dass alles beiter gezogen wird und danach wieder schmaler, weil dann wohl die SplitterDistance auf die Controls wirkt.

    Kann man das irgendwie verhindern? Das sieht irgendwie unprofessionell aus ;-)

    Mittwoch, 15. Dezember 2010 10:54

Antworten

  • Hallo S.,

    Wenn der OnLoad-Handler der Form ausgeführt wird, wird im Framework-Code (Form.cs) für jedes der Controls die Methode Invalidate() aufgerufen. Das führt natürlich dazu, dass die Anchors-Eigenschaft für alle Steuerelement und sofort honoriert wird. Wenn Du dies nicht möchtest, konfiguriere doch einfach dein SplitContainer im Form-Konstruktor (anstatt in OnLoad), oder setze im Konstruktor SplitContainer.Parent = null und später (nach der gewünschten Konfiguration) im OnLoad-Handler SplitContainer.Parent = this.

    Gruß
    Marcel

    • Als Antwort markiert SPDeveloperXP Mittwoch, 15. Dezember 2010 13:49
    Mittwoch, 15. Dezember 2010 11:31
    Moderator
  • Hallo SP.,

    man kann zum Beispiel soetwas machen:

     private void Form1_Load(object sender, EventArgs e)
     {
      this.Hide(); // ShowInTaskbar = false;
      // Deine weiteren Aktionen [...]
      // Dein: splitContainer1.SplitterDistance = neuer_Wert;
      // ShowInTaskbar = true; 
      this.Show(); // ShowInTaskbar = true;
     }

    ciao Frank
    • Als Antwort markiert SPDeveloperXP Mittwoch, 15. Dezember 2010 13:49
    Mittwoch, 15. Dezember 2010 12:34
  • Hallo S.,

    Nun ja, die letzte Gewissheit habe ich nicht, dass wir über dasselbe reden, aber im Grunde geht es mir darum, dass man es vermeiden sollte, die Größe von Steuerelementen zweimal hintereinander zu verändern. Ich würde die für Deine Anwendung relevanten Eigenschaften im SplitContainer.Resize-Ereignis setzen:

    using System;
    using System.Windows.Forms;
    
    namespace WindowsFormsApplication2
    {
      public partial class Form1 : Form
      {
        public Form1()
        {
          InitializeComponent();
          DoubleBuffered = true;
        }
    
        private void splitContainer1_Resize(object sender, EventArgs e)
        {
          splitContainer1.Panel1MinSize = splitContainer1.ClientSize.Width * 10 / 100;
          splitContainer1.Panel2MinSize = splitContainer1.ClientSize.Width * 50 / 100;
          splitContainer1.SplitterDistance = splitContainer1.ClientSize.Width * 30 / 100;
        }
      }
    }
    
    

    Gruß
    Marcel

    • Als Antwort markiert SPDeveloperXP Mittwoch, 15. Dezember 2010 13:49
    Mittwoch, 15. Dezember 2010 13:26
    Moderator

Alle Antworten

  • Hallo S.,

    Wenn der OnLoad-Handler der Form ausgeführt wird, wird im Framework-Code (Form.cs) für jedes der Controls die Methode Invalidate() aufgerufen. Das führt natürlich dazu, dass die Anchors-Eigenschaft für alle Steuerelement und sofort honoriert wird. Wenn Du dies nicht möchtest, konfiguriere doch einfach dein SplitContainer im Form-Konstruktor (anstatt in OnLoad), oder setze im Konstruktor SplitContainer.Parent = null und später (nach der gewünschten Konfiguration) im OnLoad-Handler SplitContainer.Parent = this.

    Gruß
    Marcel

    • Als Antwort markiert SPDeveloperXP Mittwoch, 15. Dezember 2010 13:49
    Mittwoch, 15. Dezember 2010 11:31
    Moderator
  • Hallo SP.,

    man kann zum Beispiel soetwas machen:

     private void Form1_Load(object sender, EventArgs e)
     {
      this.Hide(); // ShowInTaskbar = false;
      // Deine weiteren Aktionen [...]
      // Dein: splitContainer1.SplitterDistance = neuer_Wert;
      // ShowInTaskbar = true; 
      this.Show(); // ShowInTaskbar = true;
     }

    ciao Frank
    • Als Antwort markiert SPDeveloperXP Mittwoch, 15. Dezember 2010 13:49
    Mittwoch, 15. Dezember 2010 12:34
  • Hallo Marcel,

    nicht, dass wir uns falsch verstehen. Der SplitContainer wird über den Designer auf das Form gezogen und alle anderen enthaltenen Controls auch. Damit werden die Controls beim Aufruf von InitializeComponent() erzeugt und auch positioniert. Das müsste ich dann aus dem *.Designer.cs heraus ziehen und erst später wieder einfügen. Geht das dann noch richtig in einem der Events Form_Load oder Form_Shown Events?

    Mittwoch, 15. Dezember 2010 12:58
  • Hallo Frank,

    ja, also damit sieht es schon wesentlich besser aus! Jetzt sieht man noch ganz kurz das Form (wegen dem Initialize Component, in dem die Größe und die Anchors festgelegt werden), dann erst wieder sauber, nach dem Show().

    Mittwoch, 15. Dezember 2010 13:22
  • Hallo S.,

    Nun ja, die letzte Gewissheit habe ich nicht, dass wir über dasselbe reden, aber im Grunde geht es mir darum, dass man es vermeiden sollte, die Größe von Steuerelementen zweimal hintereinander zu verändern. Ich würde die für Deine Anwendung relevanten Eigenschaften im SplitContainer.Resize-Ereignis setzen:

    using System;
    using System.Windows.Forms;
    
    namespace WindowsFormsApplication2
    {
      public partial class Form1 : Form
      {
        public Form1()
        {
          InitializeComponent();
          DoubleBuffered = true;
        }
    
        private void splitContainer1_Resize(object sender, EventArgs e)
        {
          splitContainer1.Panel1MinSize = splitContainer1.ClientSize.Width * 10 / 100;
          splitContainer1.Panel2MinSize = splitContainer1.ClientSize.Width * 50 / 100;
          splitContainer1.SplitterDistance = splitContainer1.ClientSize.Width * 30 / 100;
        }
      }
    }
    
    

    Gruß
    Marcel

    • Als Antwort markiert SPDeveloperXP Mittwoch, 15. Dezember 2010 13:49
    Mittwoch, 15. Dezember 2010 13:26
    Moderator
  • Hallo SP.,

        > man sieht ... die Form ganz kurz ...

    das kann man auch in den Griff bekommen:

     public Form1()
     {
      TopLevel = false; Hide();
      InitializeComponent();
     }
    

    //==============

     private void Form1_Load(object sender, EventArgs e)
     {
       this.Hide(); // ShowInTaskbar = false;
       // Deine weiteren Aktionen [...]
       // Dein: splitContainer1.SplitterDistance = neuer_Wert;
    this.WindowState = FormWindowState.Maximized;
    TopLevel = true; this.Show(); // ShowInTaskbar = true; }

    ciao Frank
    Mittwoch, 15. Dezember 2010 13:33
  • Okay, ich denke mal hiermit belasse ich es. Das hat zwar bei mir jetzt wegen den Splitter-Distance Settings nicht mehr ganz hin, aber selbst mit dem ersten Abschnitt aus Hide() und Show() sieht schon mal wesentlich besser aus...
    Mittwoch, 15. Dezember 2010 13:49
  • Hallo SP.,

        > sieht schon mal wesentlich besser aus...

    ok, freut mich.

    ich habe übrigens noch: 
       this.WindowState = FormWindowState.Maximized;
    nachgetragen.


    ciao Frank
    Mittwoch, 15. Dezember 2010 14:09