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
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
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.
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!
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.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
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