Panelborder an gewisser Stelle offen



  • Hallo,

    folgendes habe ich vor:

    Ich habe mir UserControls erstellt, welche als Tabs agieren sollen, diese sind links neben einem weitern Panel angeordnet.
    Mein Ziel ist es nun den Border des rechten Panels an genau der Stelle an der sich das geklickte UserControl befindet offe zu lassen.

    Also in der Theorie wie folgt:

    ------------------------------------
     Tab 1       |                     |
                 |                     |
    --------------     Haupt Panel     |
     Tab 2                             |
                                       |
    --------------                     |
                 |                     |
                 |                     |
                 -----------------------
    

    In diesem Beispiel wäre nun der 2. Tab ausgewählt. - Ich denk das reicht um sich mein Ziel vorzustellen.
    Hoffe mir kann dabei jemand helfen. - Aktuell ist um jeden Tab ein durchgehender Border sowie um das Panel.

    // Anbei noch die Frage, ist es möglich einen eigenen Borderstyle zu erstellen?



  • Da wirst du wohl die Tabs und das Panel selber zeichnen müssen, d.h. BorderStyle = None und im Paint-Ereignis dann selber die Linien (mit Aussparungen) zeichnen.

    Evtl. wäre aber auch das etwas für dich (anstatt selber ein TabControl zu erstellen): http://en.csharp-online.net/TabControl (zum letzten Eintrag "Render Right-Aligned or Left-Aligned Tabs horizontally" scrollen).

    Edit: hier noch mein Beitrag dazu (bzgl. selber zeichnen) aus einem anderen C#-Forum: http://www.mycsharp.de/wbb2/thread.php?threadid=53531



  • Dann werd ich die wohl doch selber zeichnen, das TabControl an sich kann ich aufgrund des UserControl nicht nutzen, da auf diesem mehrere Dinge stehen.

    // Wäre etwas, dass man Microsoft mal vorschalgen könnte *g*, Border einzeln setzbar (links, oben, unten, rechts).



  • WPF



  • Stimmt, da ist es ja auch möglich.

    Ich mache es nun wie folgt, ich habe von vornherein eine Methode "setNeededDetails", wo ich die Liniennummer und somit die Nummer des "Tabs" als Property setze.
    Innerhalb dieser Methode führe ich auch ein "this.invalidate();" aus um das Control neu zu zeichnen.

    Die Border des TabControl zeichne ich in der OnPaint und zwar nur die Border links, oben und unten.

    Bei Auswahl einer Linie wird dann das rechte Panel neu gezeichnet und somit die OnPaint aufgerufen. Diese sieht wie folgt aus:

    private void DownTimeDetailInfo_Paint(object sender, PaintEventArgs e)
    		{
    			//get Panel rect
    			Rectangle rect = new Rectangle(0, 0, this.Width - 1, this.Height - 1);
    			// Create Graphic for border
    			Graphics border = this.CreateGraphics();
    			// draw top, bottom and right border
    			ControlPaint.DrawBorder3D(border, rect, Border3DStyle.SunkenOuter, Border3DSide.Top);
    			ControlPaint.DrawBorder3D(border, rect, Border3DStyle.SunkenOuter, Border3DSide.Bottom);
    			ControlPaint.DrawBorder3D(border, rect, Border3DStyle.SunkenOuter, Border3DSide.Right);
    
    			Pen borderpen = new Pen(Color.Gray);
    
    			// calculate endpoint for first Line of left border
    			int selectedLineTop = this.lineNumber*57+115-100;
    			// calculate beginningpoint for second Line of left border
    			int selectedLineBottom = selectedLineTop + 57;
    
    			// draw border
    			border.DrawLine(borderpen, 0, 0, 0, selectedLineTop);
    			border.DrawLine(borderpen, 0, selectedLineBottom, 0, this.Height);
    			this.BackColor = Color.LightGray;
    		}
    

Anmelden zum Antworten