C# - Form-ok „összeragasztása”

forráskód letöltése
Ha alkalmazásunk több Form-ot használ és szeretnénk elérni azt, hogy ha az egyiket mozgatja a felhasználó, akkor a másik is mozogjon vele együtt, vagyis mindig egymás mellé igazítva jelenjen meg a két Form, akkor ennek módja megtudható e cikkből.
A megvalósításhoz nincs más teendőnk, mint mind a két Form mozgatását figyelni és mindig egymáshoz igazítani az aktuális pozíciójukat.
A második Form megjelenéséhez szükségünk lesz egy Form2 típusú változóra.
    private Form2 f;
A Form1 konstruktorában létrehozzuk a Form2 egy példányát. A Form2-höz készítettünk egy MainForm nevű property-t, mely képes tárolni a Form1 példányát. Ezt tettük azért, hogy majd a Form2-ből is képesek legyünk vezérelni a Form1 működését. Maradjunk azonban még a Form1-nél.
public Form1()
{
      ...
      f = new Form2();
      f.MainForm = this;
A Form2 megjelenítését, illetve eltüntetését a button1 gomb lenyomásával tudjuk előidézni. Készítettünk egy UpdatePos nevű belső függvényt, mely a két Form-ot egymás mellé igazítja. Mivel ez csak akkor működik helyesen, ha a hívó Form az aktív, így meghívjuk a From Activate függvényét, mely ismét a Form1-et teszi aktívvá. Erre azért van szükség, mert amikor a Form2 Visible property-je éppen igaz értéket kap, akkor az lesz a programunkban az aktív Form és nem a Form1.
    private void button1_Click(object sender, System.EventArgs e)
    {       
      f.Visible = !f.Visible;
      this.Activate();
      UpdatePos();
    }
A Form1 mozgatásának figyeléséhez létrehozunk egy eseménykezelőt a Form1 Move eseményéhez. Ha itt a Form2 látható, akkor szükséges az egymáshoz igazítás, így ismét meghívjuk az UpdatePos függvényünket.
    private void Form1_Move(object sender, System.EventArgs e)
    {
      if (f.Visible)
      {
        UpdatePos();
      }
    }
Az UpdatePos függvénynek egyszerű a feladata: ha az aktív Form a Form1, akkor állítja a Form2 Left és Top property-jét úgy, hogy az pontosan a Form1 bal oldalára kerüljön. Az aktív Form vizsgálatára azért van szükség, mert amikor a Form2-t mozgatjuk, az majd a Form1-et fogja pozícionálni. Ekkor mivel változik a Form1 helyzete meghívásra kerül a Move esemény, amely hívja az UpdatePos függvényt, így az megpróbálná a Form2 helyzetét állítani, ahol az ottani Move esemény figyelése miatt ismét a Form1 helyzete kerülne állításra és ez a kör folytatódna a végtelenségig. Ezért mindig csak akkor lehet elvégezni a pozíció állítást, ha a Move az aktív Form-nál következik be.
    private void UpdatePos()
    {
      if (Form.ActiveForm == this)
      {
        f.Left = Left - f.Width;
        f.Top = Top;
      }
    }
Nézzük most a Form2-t. Itt egy MainForm property áll rendelkezésre, mely az FMainForm változóban tárolja a Form1 osztály példányát, hogy azt vezérelhessük innen is.
   public Form1 MainForm
    {
      set
      {
        FMainForm = value;
      }
    }
Így amikor létrejön a Form2-nél a Move esemény, akkor ismét ellenőrizzük, hogy melyik az aktív Form, majd ha úgy látható, hogy ez a Form2, akkor nyugodtan állíthatjuk a Form1 pozícióját, a Form2 mellé igazítva azt.
    private void Form2_Move(object sender, System.EventArgs e)
    {
      if (Form.ActiveForm == this)
      {
        FMainForm.Top = Top;
        FMainForm.Left = Left + Width;
      }
    }
Ezen lépésekkel elértük azt, hogy akár a Form1-et, akár a Form2-t mozgatja a felhasználó, a két Form mindig egymás mellett marad a képernyőn.