Frage

In einem Containerform muss ich Menü und Schaltflächen zum Öffnen von Formen haben. enter image description here

Hier bin ich vor einem Problem, wenn ich irgendeine Form öffne, die diese Hintern und die Läden über das neu geöffnete Formular kommen.enter image description here

Bitte führen Sie mich an, wie ich dieses Problem verwalten kann. Ich möchte ein neues Formular öffnen und die Bedienelemente dieser Containerform in der Hintergrundzahl behalten.

War es hilfreich?

Lösung

Ich habe auch das gleiche Problem. Ich habe eine alternative Lösung, wie unten beschrieben:

  1. Fügen Sie eine Timer -Steuerung ein
  2. Ich habe die Steuerelemente in einem Panelbehälter hinzugefügt
  3. Und machte Folgendes

    private void timer1_Tick(object sender, EventArgs e)
    {
        if ((int)MdiChildren.GetLength(0) > 0)
        {
            panel1.Visible = false;
        }
        else
        {
            panel1.Visible = true;
        }
    }
    

Andere Tipps

Ich glaube, ich sehe, was du getan hast. Sie verwenden MDI und setzen die Menü Beschriftungen und Schaltflächen in das MDI -Elternformular ein. Sie haben etwas mit dem MDI-Client-Fenster gemacht, es ist normalerweise dunkelgrau. Vielleicht haben Sie herausgefunden, wie Sie die Backcolor ändern oder die Windows -Systemfarbe ändern können. Ja, Ihr Screenshot hat es auf das Ergebnis geschossen. Das Problem ist, dass MDI -Client -Formulare dem MDI -Client -Fenster unterteilt werden. Was sie auftauchen lässt hinter Die Steuerelemente, die Sie auf das übergeordnete Formular angeben.

Es gibt keine Problemumgehung dafür, Sie müssen Ihre Benutzeroberfläche ändern. Um MDI zu behalten, setzen Sie ein Panel auf das übergeordnete Formular und setzen Sie seine Dock -Eigenschaft nach links. Bewegen Sie die Menüsteuerung dazu. Das MDI -Client -Fenster schrumpft nun und besetzt den Rest der übergeordneten Form. Und die Kinderformen werden sich auf diesen Bereich beschränken. Das schmerzhafte Stück ist, dass Sie das Menü neu organisieren müssen, um den viel kleineren Platz in der Panel anzupassen.

Wenn es sich um eine MDI -Anwendung handelt und Sie Steuerelemente in das übergeordnete Fenster einfügen, werden sie über alle erstellten untergeordneten Fenster angezeigt. Sie müssen Ihr Menü auch in einem untergeordneten Fenster haben, nicht im übergeordneten Formular.

Schau dir das an Artikel und Dies.

vorläufig das:

Die übergeordnete Form kann keine Steuerelemente enthalten. >

Bearbeiten: Zusätzliche Informationen hinzugefügt

@Hans Passant hat die richtige Antwort, aber Sie können Ihr Problem auch lösen, indem Sie überhaupt keine MDI -Formulare verwenden. Einige Optionen:

  • Verwenden Sie separate Formulare: Haben Sie ein Menüformular, das normalerweise groß/maximiert ist, und starten Sie unter dem Vorgang Kinderformulare, indem Sie ihre festlegen Parent Eigenschaft zum Menüformular oder
  • Verwenden Sie ein einzelnes Formular, jedoch mit einer Docking -Bibliothek (ich habe verwendet Dockpanel Suite in der Vergangenheit). Dies ist im Wesentlichen eine Neuauflagen von MDI-Formen mit zusätzlichen Funktionen. Dies ist ein bisschen Arbeit, um zu laufen, aber es kann Sie ermöglichen, eine schöne Benutzeroberfläche aufzubauen.

Beide würden jedoch erhebliche Änderungen an Ihrem UI -Code erfordern.

Der Haupttrick hier ist, Kinderformen als Kontrollen zu behandeln. Sie erstellen wie jede andere Kontrolle ein Kinderformular. Wenn Sie diese Methode verwenden, müssen Sie ein Toplevel auf False einstellen - sonst funktioniert sie nicht.

Die folgenden Codezeilen werden verwendet, um ein untergeordnetes Formular zu erstellen:

Form childForm = new Form(); //initialize a child form

childForm.TopLevel = false; //set it's TopLevel to false

Controls.Add(childForm); //and add it to the parent Form
childForm.Show(); //finally display it

childForm.BringToFront(); //use this it there are Controls over your form.

mehr Details hier

Es scheint, als ob diese Form ein Geschwister dieser anderen Kinderkontrollen ist. Müssen Sie es als Kind dieses Fensters öffnen? Kann es nicht wie ein nicht-modales Dialogfeld und nicht wie ein untergeordnetes Fenster dieser Hauptform sein?

Wenn es sich in dieser Hauptform und einem Geschwister dieser Kontrollen befinden muss, müssen Sie die Z-Ordnung davon festlegen. Dafür gibt es keine Eigenschaft, also müssen Sie auf den Win32 -API -Anruf schauen, SetWindowPos:

[DllImport("user32.dll", EntryPoint = "SetWindowPos")]
public static extern bool SetWindowPos(
int hWnd, // window handle
int hWndInsertAfter, // placement-order handle
int X, // horizontal position
int Y, // vertical position
int cx, // width
int cy, // height
uint uFlags); // window positioning flags


const uint SWP_NOSIZE = 0x1;
const uint SWP_NOMOVE = 0x2;
const uint SWP_SHOWWINDOW = 0x40;
const uint SWP_NOACTIVATE = 0x10;

Und nennen Sie es ungefähr so:

SetWindowPos((int)form.Handle,   // that form
             (int)insertAfter.Handle,  // some other control
             0, 0, 0, 0,
             SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW | SWP_NOACTIVATE);

Rufen Sie Bringtofront () in jedem Kinderform an, nachdem Sie sie gezeigt haben. Wenden Sie sich abwechselnd an die Onload -Methode jedes Kinderformulars:

childForm.OnLoad += (s, e) => (s as Form).BringToFront();

Ich hatte dieses Problem und löste es so:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
    [DllImport("user32.dll", SetLastError = true)]
    static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);

    Form2 F2;
    public Form1()
    {
        InitializeComponent();
        F2 = new Form2();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        Panel P1 = new Panel();
        P1.Location = new Point(0, 0);
        P1.Height = this.Height;
        P1.Width = this.Width;
        P1.BackColor = Color.Transparent;
        this.Controls.Add(P1);

        SetParent(F2.Handle, P1.Handle);
        F2.Owner = this;

        F2.Show();
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top