c# - studio - Visualización de ruta en la etiqueta
visual studio installer (5)
@ lubos hasko Su código es 95% allí. El único problema es que el texto recortado se dibuja sobre el texto que ya está en la etiqueta. Esto se resuelve fácilmente:
Label label = (Label)sender;
using (SolidBrush b = new SolidBrush(label.BackColor))
e.Graphics.FillRectangle(b, label.ClientRectangle);
TextRenderer.DrawText(
e.Graphics,
label.Text,
label.Font,
label.ClientRectangle,
label.ForeColor,
TextFormatFlags.PathEllipsis);
¿Hay algún método automático para recortar una cadena de ruta en .NET?
Por ejemplo:
C:/Documents and Settings/nick/My Documents/Tests/demo data/demo data.emx
se convierte
C:/Documents.../demo data.emx
Sería particularmente genial si esto estuviera integrado en la clase Label, y parece recordar que sí, ¡aunque no lo encuentro!
Aunque no es difícil escribir tú mismo:
public static string TrimPath(string path)
{
int someArbitaryNumber = 10;
string directory = Path.GetDirectoryName(path);
string fileName = Path.GetFileName(path);
if (directory.Length > someArbitaryNumber)
{
return String.Format(@"{0}.../{1}",
directory.Substring(0, someArbitaryNumber), fileName);
}
else
{
return path;
}
}
Supongo que incluso podría agregarlo como un método de extensión.
Lo que estás pensando en la etiqueta es que pondrá ... si es más largo que el ancho (no se establece en tamaño automático), pero eso sería
c:/Documents and Settings/nick/My Doc...
Si hay soporte, probablemente estaría en la clase Path en System.IO
Puede usar el método System.IO.Path.GetFileName y anexar esa cadena a una cadena System.IO.Path.GetDirectoryName abreviada.
Usar TextRenderer.DrawText con TextFormatFlags.PathEllipsis marca
void label_Paint(object sender, PaintEventArgs e)
{
Label label = (Label)sender;
TextRenderer.DrawText(e.Graphics, label.Text, label.Font, label.ClientRectangle, label.ForeColor, TextFormatFlags.PathEllipsis);
}
Tu código es 95% allí. El único problema es que el texto recortado se dibuja sobre el texto que ya está en la etiqueta.
Sí, gracias, era consciente de eso. Mi intención era solo demostrar el uso del método DrawText
. No sabía si desea crear evento manualmente para cada etiqueta o simplemente anular el método OnPaint()
en la etiqueta heredada. Gracias por compartir tu solución final.