it-swarm.com.de

Bringen Sie die Winforms-Steuerung nach vorne

Gibt es andere Methoden, um ein Steuerelement nach vorne zu bringen, als Steuerelement.BringToFront ()? Ich habe eine Reihe von Etiketten auf einem Benutzersteuerelement, und wenn ich versuche, eines davon in den Vordergrund zu bringen, funktioniert es nicht. Ich habe sogar alle Steuerungen durchgeschleift und alle zurückgeschickt, mit Ausnahme derjenigen, die mich interessiert, und es ändert nichts.

Hier ist die Methode, bei der dem Benutzersteuerelement ein Etikett hinzugefügt wird

private void AddUserLabel()
{
    UserLabel field = new UserLabel();
    ++fieldNumber;

    field.Name = "field" + fieldNumber.ToString();         

    field.Top = field.FieldTop + fieldNumber;
    field.Left = field.FieldLeft + fieldNumber;
    field.Height = field.FieldHeight;
    field.Width = field.FieldWidth;
    field.RotationAngle = field.FieldRotation;
    field.Barcode = field.BarCoded;
    field.HumanReadable = field.HumanReadable;
    field.Text = field.FieldText;
    field.ForeColor = Color.Black;

    field.MouseDown += new MouseEventHandler(label_MouseDown);
    field.MouseUp += new MouseEventHandler(label_MouseUp);
    field.MouseMove += new MouseEventHandler(label_MouseMove);

    userContainer.Controls.Add(field);

    SendLabelsToBack(); //Send All labels to back

    userContainer.Controls[field.FieldName].BringToFront();
}

Hier ist die Methode, die alle nach hinten schickt.

private void SendLabelsToBack()
{
    foreach (UserLabel lbl in userContainer.Controls)
    {
        lbl.SendToBack();
    }
}
15
Nathan

Ja, es gibt einen anderen Weg. Die Controls.SetChildIndex() ändert auch die Z-Reihenfolge. Der mit dem Index 0 steht oben. Kauft Ihnen jedoch nichts, BringToFront() verwendet diese Methode.

Ihre SendLabelsToBack()-Methode kann nicht funktionieren, sie sendet auch das Etikett an die Rückseite. Aber Ihre nächste Aussage behebt das wieder.

Okay, das funktioniert nicht, was bedeutet, dass die BringToFront()-Methode nicht ausgeführt wird. Suchen Sie im Ausgabefenster nach einer Benachrichtigung "Erste Chance". Wie geschrieben, wird Ihre SendLabelsToBack() eine Ausnahme auslösen, wenn das Benutzersteuerelement ein anderes Steuerelement als ein UserLabel enthält. Legen Sie außerdem einen Haltepunkt after the BringToFront() fest, und überprüfen Sie den Wert von userContainer.Controls[0].Name, wenn er unterbrochen wird.

18
Hans Passant

Der Z-Index der Steuerelemente ist pro Container. 

Wenn Sie BringToFront für ein Steuerelement aufrufen, das sich in einem Container befindet (z. B. Panel), wird der Container nicht in den Vordergrund gestellt.
Daher wird das Steuerelement nur vor anderen Steuerelementen in diesem Container angezeigt.

Um zu sehen, in welchen Containern sich Ihre Steuerelemente befinden, können Sie den Bereich Dokumentgliederung im Menü Ansicht verwenden.

EDIT: Ihr userContainer-Steuerelement befindet sich wahrscheinlich hinter einem anderen Steuerelement.

6
SLaks

Haben Sie Invalidate() nach BringToFront() ausprobiert? BringToFront löst das Paint-Ereignis nicht aus

versuche dies:

private void SendLabelsToBack()
{
    foreach (UserLabel lbl in userContainer.Controls)
    {
        lbl.SendToBack();
        lbl.Invalidate();
    }
}
5
Patrick

Ich denke, Sie müssen nur Ihre letzte Zeile ändern:

userContainer.Controls[field.FieldName].BringToFront(); 

zu diesem:

userContainer.Controls[field.Name].BringToFront(); 

Wenn Sie eine Zeichenfolge als Indexer für die Controls-Auflistung verwenden, wird die Eigenschaft Name des Steuerelements verwendet (nicht die Eigenschaft FieldName).

Da Sie nur versuchen, das zuletzt hinzugefügte Steuerelement an die Spitze zu bringen, würde dies auch funktionieren:

userContainer.Controls[userContainer.Controls.Count - 1].BringToFront();
2
MusiGenesis

Meiner Erfahrung nach sieht Windows aus, dass alle Steuerelemente, die zu einem Grafikcontainer (Teilfenster, Gruppenfeld usw.) gehören, in eine Software-Sammlung aufgenommen werden. Die Auflistung wird nach untergeordnetem Index geordnet, der eine Eigenschaft jedes Steuerelements in diesem Container ist. Der Trick ist, dass Kinder mit demselben Index existieren können und müssen. In diesem Fall malen Windows die unterordneten Kinder relativ zu den anderen, aber dazwischen werden sie in umgekehrter Reihenfolge, in der sie dem Container hinzugefügt wurden, malen. 

Um es kurz zu machen: Für einen Container müssen Sie sicherstellen, dass Steuerelemente unterschiedliche Indizes haben, indem Sie ALLE NICHT EINIGE der Indizes ändern, wenn Sie die Z-Reihenfolge ändern möchten. Zum Beispiel:

foreach (Control newControl in TopControl.Controls)
{
   TopControl.Controls.SetChildIndex(newControl,indexlogic(newControl));
}

dabei ist indexLogic(newControl ) Ihre Methode zur Berechnung des Index der jeweiligen Kontrolle.

0
Gogu CelMare