3 Stimmen

Benutzerdefinierte Verankerung in Windows Forms

Ich habe ein benutzerdefiniertes Formular mit 4 Feldern an den Rändern. Ich möchte ein weiteres Panel verankern, um Benutzersteuerelemente an den sichtbaren Rändern des Formulars zu enthalten. Sobald das geschehen ist, möchte ich dann eine unbestimmte Anzahl von Steuerelementen an das bereits verankerte Feld verankern. Ich bin ein ziemlicher Neuling auf diesem Gebiet und weiß nicht, ob dies der beste Weg ist, um mein Ziel zu erreichen, eine Liste von Objekten zu haben, deren Größe sich ändert, wenn die Größe des Formulars geändert wird. Der Grund, warum ich so vorgehe, ist, dass ich möchte, dass die Objekte anklickbar und verschiebbar sind, nicht nur Textzeilen.

Mein Gedanke ist in etwa so.

----------------------------------------
| Header Panel                         |
----------------------------------------
|| <--left panel         right panel->||
|| [ user control object             ]||
|| [ user control object             ]||
|| [ user control object             ]||
|| [ user control object             ]||
----------------------------------------
| Bottom Panel                         |
----------------------------------------

Derzeit bin ich in der Lage, das Bedienfeld zu zeichnen, die die Benutzer-Steuerelement-Objekte wie gewünscht hält, aber es nicht mit der übergeordneten Größe ändern, und wenn ich versuche, es an der übergeordneten zu verankern, es an der falschen Stelle verankert. Ich habe auch versucht, die Benutzer-Steuerungsobjekte mit dem Benutzer-Steuerungsfeld zu verankern, aber sie ändern ihre Größe überhaupt nicht.

Hier ist also der Code für das Container-Panel

//This is called after InitializeComponent(), I would assume the anchor would go 
//in here somewhere, but I need the anchor to be offset by the bounds of the 
//other panels as listed below.
private static void SetQuestionContainerBounds(SessionReviewForm instance)
{
   instance.pnlQuestionContainer.Top = instance.HeaderPanel.Bottom;
   instance.pnlQuestionContainer.Left = instance.LeftPanel.Right;
   instance.pnlQuestionContainer.Width = instance.RightPanel.Left - instance.pnlQuestionContainer.Left;
   instance.pnlQuestionContainer.Height = instance.StatusPanel.Top - instance.pnlQuestionContainer.Top;
}

Nachdem ich das Formular erstellt und den pnlQuestionContainer positioniert habe, beginne ich mit der Erstellung von Benutzersteuerelementen, die Basisfrageobjekte genannt werden, verankere sie und füge sie dem pnlQuestionContainer hinzu

private void DisplayData()
{
// tracks the number of questions, used in placement of objects
int questionCount = 0;

// if the session question is marked for review
// generate a new question object and place it.
foreach (SessionQuestion sq in thisSessionPart.SessionQuestions)
{
    if(sq.MarkForReview)
    {
        BaseQuestionObject bqo = new BaseQuestionObject(sq, parentSession);

        BaseQuestionObject.FitAndPlaceObject(pnlQuestionContainer, bqo, questionCount);

        bqo.Anchor = (AnchorStyles.Left | AnchorStyles.Right);

        pnlQuestionContainer.Controls.Add(bqo);

        questionCount++;
    }
}
}

Ein Basisfrageobjekt besteht derzeit aus drei Teilen. Einem userControl, einem Gruppenfeld und einer Beschriftung. Alle diese Elemente sind auf autosize mit Anker von links, rechts mit Ausnahme der Benutzer-Steuerelement, wie ich kann nicht festgelegt, dass in der Eigenschaften-Fenster, aber ich denke, ich bin es in der obigen Methode eingestellt.

Die aktuellen Ergebnisse sind, dass der Container-Panel ist perfekt auf den ersten gezeichnet, aber es nie Größe ändern. Die Frageobjekte werden in der gleichen Größe gezeichnet, in der sie erstellt wurden, obwohl dies nicht die maximale oder minimale Größe ist.


[EDIT] Das Problem, das ich hatte, war, dass die Ankerstile nicht mit autosize zusammenspielten. Nach dem Ausschalten von autosize und der Bearbeitung der anchorStyles konnte ich die gewünschten Ergebnisse erzielen.

4voto

RLH Punkte 14436

Erstens bin ich mir nicht zu 100 % sicher, was Sie zu tun versuchen, aber Verankerung ist viel einfacher als die Art und Weise, wie Sie es zu erreichen versuchen.

Jedes Steuerelement hat eine Eigenschaft namens Anchor die ein AnkerStile Aufzählung. Diese Werte können "Links", "Rechts", "Oben", "Unten" oder "Keine" sein und können mit einem bitweisen ODER verknüpft werden, um mehrere Verankerungswerte zu ermöglichen.

Der Standardwert für "Anker" ist Oben-Links. Wenn Sie die Verankerung auf Oben-Rechts ändern, behalten Ihre Steuerelemente die gleiche Größe, "schweben" aber mit der rechten Seite Ihres Anwendungsfensters, wenn es in der Größe verändert wird. Wenn Sie links, oben und rechts verankern, wachsen und schrumpfen Ihre Steuerelemente, wenn Sie die Breite des Fensters ändern.

Ich glaube nicht, dass Sie eines dieser Bedienfelder benötigen, es sei denn, sie werden verwendet, um Steuerelemente logisch zusammenzufassen. Sie können mit der Verankerung experimentieren, indem Sie eine Reihe von Steuerelementen auf einem Formular platzieren und ihre Verankerungseinstellungen ändern. Führen Sie Ihr Testformular aus und ändern Sie die Größe, um zu sehen, was passiert.

Wenn Sie den Inhalt Ihres Formulars beim Vergrößern und Verkleinern des Fensters neu anordnen möchten, bietet die MS-Standard-Toolbox einige Steuerelemente, mit denen Sie herumspielen können. Schauen Sie sich insbesondere die FlowLayoutPanel et TableLayoutPanel . Mit diesen Steuerelementen können Sie fein abstimmen, wie Sie Ihre untergeordneten Steuerelemente auf einem Formular oder in einem Abschnitt eines Formulars neu positionieren möchten.

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