2010-03-07 7 views
6

Esiste un controllo (WinForms) di una casella di testo intelligente in grado di visualizzare un percorso in base alla larghezza della casella di testo. Ad esempio, se il percorso è breve, verrà visualizzato l'intero percorso (C: \ myfile.txt), ma se il percorso è lungo verrà visualizzato l'inizio e la fine (C: \ SomeFolder ... \ foo \ MyFile.txt). La lunghezza dei caratteri visualizzati deve essere calcolata (in modo dinamico) dalla casella di testo utilizzando la larghezza. Qualsiasi suggerimento commerciale o open source è benvenuto. Grazie mille.C# WinForms - Controllo Smart TextBox per la formattazione automatica della lunghezza del percorso in base alla larghezza della casella di testo

risposta

15

Sì, è una funzionalità integrata del metodo TextRenderer.DrawText(). Uno dei suoi overload accetta un argomento TextFormatFlags, puoi passare TextFormatFlags.PathEllipsis. Fare questo per un TextBox non è appropriato, l'utente non può modificare ragionevolmente un tale percorso abbreviato, non avresti alcuna idea di quale potrebbe essere il percorso originale. Un'etichetta è il miglior controllo.

Aggiungi una nuova classe al tuo progetto e incolla il codice mostrato di seguito. Compilare. Rilasciare il nuovo controllo dalla parte superiore della casella degli strumenti sul modulo. Non renderlo troppo piccolo.

using System; 
using System.ComponentModel; 
using System.Windows.Forms; 

class PathLabel : Label { 
    [Browsable(false)] 
    public override bool AutoSize { 
    get { return base.AutoSize; } 
    set { base.AutoSize = false; } 
    } 
    protected override void OnPaint(PaintEventArgs e) { 
    TextFormatFlags flags = TextFormatFlags.Left | TextFormatFlags.PathEllipsis; 
    TextRenderer.DrawText(e.Graphics, this.Text, this.Font, this.ClientRectangle, this.ForeColor, flags); 
    } 
} 
+0

+1 Hans! Questo e 'esattamente quello che stavo cercando! :) –

+0

Questo è fantastico! Tuttavia, quando imposto il 'Graphics' su' SmoothingMode.AntiAlias', TextRenderer non sembra onorarlo. – petejamd