11 Stimmen

Kann ich ein Windows-Formular innerhalb eines Steuerelements hosten?

Ich habe einen Kunden, der ein Visual Basic-Projekt im Einzelinstanzmodus mit einer verdrahteten Präsentationslogik hat.

Das Hauptformular enthält ein TabControl mit mehreren TabPages. Wenn ich auf TabPageA klicke, wird ein anderes Formular vor dem Formular angezeigt, das die gleiche Größe wie die TabPage hat.

Wenn ich auf TabPageB klicke, wird das erste Formular ausgeblendet und ein anderes Formular angezeigt. Für den Benutzer sieht es also so aus, als hätten Sie ein TabControl mit verschiedenen TabPages, was nicht der Fall ist.

Ich habe versucht, die Forms in UserControls umzuwandeln und sie in die TabPage zu setzen, aber dank der SingleInstance-App würde dies eine Menge Refactoring erfordern. Ich habe es versucht, aber schließlich aufgegeben, weil viele viele Laufzeitfehler und ich will nicht noch mehr Mühe in diese zu setzen.

Meine Idee war, dass ich zur Laufzeit die Formulare zu den TabPages hinzufügen und sie wie UserControls agieren lassen könnte, ist das überhaupt möglich?

39voto

Hans Passant Punkte 894572

Sie können eine Formularklasse in ein untergeordnetes Steuerelement zurückverwandeln, indem Sie ihre TopLevel-Eigenschaft auf False setzen. Es wird im Wesentlichen ein UserControl mit etwas ungenutztem Overhead. So kann es ähnlich aussehen wie hier:

Public Class Form1
    Public Sub New()
        InitializeComponent()
        Dim frm As New Form2
        frm.TopLevel = False
        frm.FormBorderStyle = Windows.Forms.FormBorderStyle.None
        frm.Visible = True
        frm.Dock = DockStyle.Fill
        TabPage1.Controls.Add(frm)
    End Sub
End Class

6voto

Ry- Punkte 208020

Jedes Fenster kann in jedem anderen Fenster untergebracht werden (ein Control ist technisch gesehen ein Fenster). SetParent .

<System.Runtime.InteropServices.DllImport("user32.dll")>
Public Function SetParent(ByVal hWndChild As IntPtr, ByVal hWndNewParent As IntPtr) As IntPtr

End Function

zu deklarieren und

SetParent(FormToHost.Handle, ControlToHostForm.Handle)

zu verwenden. Es ist vielleicht nicht ideal, aber es ist in Ordnung, wenn Sie nicht noch mehr Aufwand betreiben wollen, wie Sie sagen. Die Formulare werden ordnungsgemäß maximiert und minimiert, erscheinen nicht in der Taskleiste und werden mit ihren Containern geschlossen.

-1voto

Adept Punkte 1

Sie können Panels verwenden. In jeder Registerkarte müssen ein oder mehrere Panels angezeigt und ein oder mehrere andere ausgeblendet werden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X