2014-01-19 21 views
9

Ich fand heraus, dass untergeordnete Steuerelemente nicht außerhalb der Grenzen ihrer Eltern gezeichnet werden. Wenn ich also einen Knopf habe, der rechts von den Paneelen herausragt, wird er auf halbem Weg zu dem Teil gezogen, wo das Paneel endet.C# -Steuerelemente außerhalb der Grenzen von Eltern?

2 Fragen:

  • Gibt es jeden Weg Kind Kontrollen außerhalb der Eltern Grenzen zu haben (mit einigem Trick vielleicht)?
  • Was ist der Grund für diese Einschränkung? (Ich möchte, dass verstehen)


Beispiel mit 2 Tasten: b1 ist der große Elternteil, b2 dem kleineren Kind:

public Form1() 
{ 
    Size = new Size(800, 600); 

    Button b1 = new Button(); 
    b1.Text = "hello world"; 
    b1.SetBounds(0,0,256,128); 
    Controls.Add(b1); 

    Button b2 = new Button(); 
    b2.Text = "abcdefghijklmnopqrstuvwxyz"; 
    b2.SetBounds(192,32,128,64); 
    b1.Controls.Add(b2); 
} 

Edit:
Es geht um Kontrollen innen Kontrollen nicht Kontrollen in Formen .
Nein, keine ausgefallene Benutzeroberfläche. Ich weiß, dass ich Regionen nutzen kann, um verrückte Desktop-Apps zu erstellen. Das ist nicht was ich will.

Danke!

+1

Ich bin neugierig: Warum willst du das tun? – xxbbcc

Antwort

4

Ein Form ist auch ein Steuerelement, so verhält es sich sehr ähnlich wie andere Steuerelemente.

Die Rendering-Einschränkung ergibt sich aus der Tatsache, dass Steuerelemente Fenster im Betriebssystem sind, die nur einen rechteckigen Bereich des Displays darstellen. Ein Fenster kann nichts außerhalb seiner eigenen Grenzen zeichnen. Wenn ein untergeordnetes Steuerelement außerhalb dieser Grenzen platziert wird, wird es nicht (oder nur teilweise, abhängig von seiner Position) gerendert.

Es gibt keinen einfachen Weg darum und das ganze Konzept der Kindersteuerung dreht sich um den Elternteil, der kontrolliert, was gezeichnet wird. Wenn Sie ein untergeordnetes Steuerelement außerhalb der Grenzen seines übergeordneten Elements zeichnen möchten, entfernen Sie das "untergeordnete Element" vom übergeordneten Element, da die Beziehung nicht wirklich zutrifft.

Sie können einige benutzerdefinierte Rendering-Code, der würde um diese Frage, aber Steuerelemente wäre nicht wahr Kinder von anderen Containern und müssten Sie eine Menge Render-Code schreiben, um es zu arbeiten. Es kann Situationen geben, in denen dies das gewünschte Verhalten ist, aber in den meisten Fällen ist das Verhalten des Standardsystems besser (und bedeutet weniger Arbeit für den Programmierer).

Sie können einen visuellen Effekt einer Schaltfläche erhalten, die sich "außerhalb" des Formulars befindet, indem Sie das Formular benutzerdefiniert rendern (dh es kleiner zeichnen als es tatsächlich ist) und dann die Schaltfläche im leeren Bereich rendern. Dies ist jedoch eine Menge Arbeit und ich bin mir nicht sicher, ob Sie diesen Weg gehen wollen.

Wenn Sie versuchen, eine ausgefallene Benutzeroberfläche zu erstellen, bei der einige Steuerelemente wie ein Blob (nicht wie ein Rechteck) geformt sind oder frei von der Hauptbenutzeroberfläche angezeigt werden, ähnlich wie bei einigen Media Playern usw. : diese Programme machen das ganze custom-rendering Ding; Ihre Fenster sind immer noch rechteckige Fenster, aber beim Rendern verwenden sie transparente Bilder und Regionen, um das Formular zu rendern.

Es würde helfen, wenn Sie Ihrer Frage, warum Sie dies tun möchten, mehr Details hinzugefügt haben.

+0

Ich arbeite gerade an einem Steuerelement mit sehr komplexer Funktionalität, und ich muss es auf einige untergeordnete Steuerelemente aufteilen, um die Entwicklung zu erleichtern. Denkst du, es wäre gut, einen großen Elternteil für meinen "Elternteil" und seine Kinder zu haben, was zu einem neuen großen Elternteil und allen Kontrollen führen würde, die ich jetzt als Geschwister habe? Und nein zu dem ausgefallenen UI-Teil ^^ – n4pgamer

+0

@ n4pgamer Tut mir leid, das verstehe ich nicht ganz, aber lass mich versuchen zu antworten. Wenn Sie ein komplexes benutzerdefiniertes Steuerelement erstellt haben, dann teilen Sie kleinere Blöcke in andere benutzerdefinierte Steuerelemente auf und fügen Sie diese dann in das benutzerdefinierte Hauptsteuerelement als untergeordnete Elemente ein. Wenn Sie weitere Details zur Struktur des Steuerelements hinzufügen, versuche ich, der Antwort mehr hinzuzufügen. – xxbbcc

0

In WinForms ist es nicht möglich, außerhalb der Grenzen eines Steuerelements zu zeichnen.

Der einfachste Weg, um eine Schaltfläche auf die Innenseite eines Panels zu beschränken, ist die Anchor-Eigenschaft entsprechend zu verwenden. Normalerweise sind die Schaltflächen richtig ausgerichtet. Wenn Sie diese Ausrichtung beibehalten möchten, wenn die Größe des Steuerfelds geändert wird, docken Sie die Schaltfläche an die rechte Seite an. Wenn der Button unten ist, verankere ihn auch unten, sonst nach oben.

Wenn Sie die Größe der Schaltfläche mit der Breite des Bedienfelds ändern möchten, docken Sie sie gleichzeitig links und rechts neben und zusätzlich oben oder unten an.

enter image description here
Bild gefunden hier: Getting Started with Windows Forms: Anchor the Buttons to the Bottom Right.

2

Sie können nicht außerhalb der Steuerelemente/Eltern Grenzen zeichnen. Sie können das Steuerelement jedoch in einem der Vorfahren der Eltern platzieren.

Dies ist ein Code verwende ich eine Dropdown-Menü zu erstellen, wenn diese individuelle Steuerung umgeschaltet wird:

private void Me_ToggledChanged(System.Object sender, System.EventArgs e) 
{ 

    if (this.Parent != null) { 


     Control topParent = this; 
     int x = 0; 
     int y = 0; 

     while (topParent.Parent != null) { 
      x += topParent.Left; 
      y += topParent.Top; 
      topParent = topParent.Parent; 
     } 

     if (this.Toggled) { 
      if (!topParent.Controls.Contains(dropDownMenu)) { 
       topParent.Controls.Add(dropDownMenu); 
      } 

      dropDownMenu.Location = new Point(x, y);   
      dropDownMenu.Visible = true; 
      dropDownMenu.BringToFront(); 
     } else { 
      if (topParent.Controls.Contains(dropDownMenu)) { 
       this.Parent.Controls.Remove(dropDownMenu); 
      } 
      dropDownMenu.Visible = false; 
     } 

    } 
} 

Die DropDownMenu ist ein Steuerelement, das Setup an anderer Stelle im Konstruktor dieser Kontrolle ist.

Ich beginne mit dem obersten Elternteil, während ich jeden Elternteil überprüfe, bekomme ich auch einen laufenden x- und y-Wert der Steuerposition relativ zum Elternteil.

Wenn dieses Steuerelement umgeschaltet wird, dann füge ich es zum obersten Elternteil hinzu und setze seine Position, sonst entferne ich es.

Ich bin sicher, es gibt komplexere Möglichkeiten und dies funktioniert möglicherweise nicht unter allen Umständen, aber diese Lösung funktioniert perfekt für mich eine .NET CF-Menüschaltfläche schreiben.

Verwandte Themen