Laden...

Labeltext rechtsbündig in Label mit fixer Breite, wenn Text länger als Labelbreite?

Erstellt von garv3 vor 11 Jahren Letzter Beitrag vor 11 Jahren 1.847 Views
G
garv3 Themenstarter:in
70 Beiträge seit 2009
vor 11 Jahren
Labeltext rechtsbündig in Label mit fixer Breite, wenn Text länger als Labelbreite?

Komplizierter Titel, einfacher Sachverhalt:

Ich Suche nach einer Möglichkeit, einen Text in einem Label, das eine feste Breite hat, so darzustellen, dass er immer rechtsbündig dargestellt wird. Auch dann, wenn er über das Label hinausragt. Der Text ist ein Dateipfad und ich möchte, dass man immer den Dateinamen sieht.

Beispiel:
Text: "c:\mein Ordner\mein Unterordner\meine Datei.txt"
aktuelle Ausgabe [c:\mein Ordner\mein Unterordn...]
gewünschte Ausgabe [...ein Unterordner\meine Datei.txt]

Bereits probiert habe ich:
TextAlign -> TopRight
AutoEllipsis -> true
LeftToRight -> true.
Funktioniert leider trotzdem nicht.

Hat jemand eine Idee?

Dank und Gruß
garv3

C
224 Beiträge seit 2009
vor 11 Jahren

Eine Möglichkeit wäre ein verstecktes Label mit AutoSize = true zur Längenberechnung zu verwenden.

Beispiel (Achtung, optimierungsbedarf):


       private void txtPath_TextChanged(object sender, EventArgs e)
        {
            string temp = txtPath.Text;
            string display = temp;
            lblCalculateWidth.Text = display;
            while (lblCalculateWidth.Width > lblPath.Width)
            {
                temp = temp.Substring(1);
                display = "..." + temp;
                lblCalculateWidth.Text = display;
            }
            lblPath.Text = display;
        }

Eine weitere Möglichkeit wäre mit MeasureText statt dem Label die Längenberechnung vorzunehmen. Aber das ist nicht ohne, wenn man es genau nimmt: MeasureString und Alternativen [Minimales einschließendes Rechteck der Schrift ermitteln]

Gruß, CoLo

771 Beiträge seit 2009
vor 11 Jahren

Hi,

für Dateipfade würde ich immer eine readonly-TextBox nehmen, damit der User die Möglichkeit hat per Copy (Ctrl+C) den Pfad daraus zu extrahieren. Und für Rechtsbündigkeit SelectionStart auf Length setzen:


textBox.SelectionStart = textBox.TextLength;

Um Dateipfade zu kürzen gibt es auch die WinAPI-Funktion PathCompactPathEx

Oder aber mittels DrawText selber zeichnen: C# WinForms - Smart TextBox Control to auto-Format Path length based on Textbox width und dann TextFormatFlags.Right (statt Left) benutzen.

G
garv3 Themenstarter:in
70 Beiträge seit 2009
vor 11 Jahren

Danke für die Anregungen. Die Variante mit der TextBox gefällt mir ziemlich gut. Leider gibt es da natürlich keine AutoEllipsis. Daher wird der Text links ziemlich abrupt abgeschnitten, wenn man den Rahmen der TextBox entfernt. Sieht gewöhnungsbedürftig aus, scheint aber wohl die beste Lösung zu sein.
Danke!

16.835 Beiträge seit 2008
vor 11 Jahren

Prüf doch die Länge, damit Du weißt ob der Pfad vollständig in die Textbox passt oder nicht und zeig zum Beispiel C:\Programs\..\..\..\File.txt oder ...\Dir1\Dir2\File.txt an.

49.485 Beiträge seit 2005
vor 11 Jahren

Hallo garv3,

wenn man für den Pfad einen Monospaced-Font verwendet, kann man die Berechnung, wieviel man (wo) kürzen (kann und) muss, auf das Zählen der Anzahl der Zeichen reduzieren. Dabei würde ich es vorziehen, wenn in er Mitte gekürzt würde und nach Möglichkeit immer so, dass komplette Verzeichnisnamen wegfallen, also aus C:\Das\ist\der\Pfad\zur\Datei.txt z.B. C:\Das\ist...\zur\Datei.txt.

Copy&Paste sollte natürlich so implementiert werden, dass der Original-Pfad ohne die Kürzungen in die Zwischenablage kommt.

herbivore