문제

.NET에서 경로 문자열을 자르는 자동 방법이 있습니까?

예를 들어:

C:\Documents and Settings\nick\My Documents\Tests\demo data\demo data.emx

된다

C:\Documents...\demo data.emx

이것이 Label 클래스에 내장되어 있다면 특히 멋질 것입니다. 그런데 기억이 나지만 찾을 수 없습니다!

도움이 되었습니까?

해결책

사용 TextRenderer.DrawText ~와 함께 TextFormatFlags.PathEllipsis 깃발

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);
}

귀하의 코드는 95% 거기에 있습니다.유일한 문제는 트림 된 텍스트가 이미 레이블에있는 텍스트 위에 그려진다는 것입니다.

네, 감사합니다. 그 사실을 알고 있었습니다.내 의도는 단지 DrawText 방법.각 라벨에 대한 이벤트를 수동으로 생성할지 아니면 그냥 재정의할지 알 수 없었습니다. OnPaint() 상속된 레이블의 메서드입니다.그래도 최종 솔루션을 공유해 주셔서 감사합니다.

다른 팁

@ 루보스 하스코 귀하의 코드는 95% 거기에 있습니다.유일한 문제는 잘린 텍스트가 이미 레이블에 있는 텍스트 위에 그려지는 것입니다.이 문제는 쉽게 해결됩니다.

    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);

그래도 직접 작성하는 것은 어렵지 않습니다.

    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;
        }
    }

확장 메서드로 추가할 수도 있을 것 같습니다.

당신이 라벨에 대해 생각하는 것은 그것이 넣을 것이라는 것입니다 ...너비보다 긴 경우(자동 크기로 설정되지 않음)

c:\Documents and Settings\nick\My Doc...

지원이 있다면 아마도 System.IO의 Path 클래스에 있을 것입니다.

System.IO.Path.GetFileName 메서드를 사용하고 해당 문자열을 단축된 System.IO.Path.GetDirectoryName 문자열에 추가할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top