6

.NET でパス文字列を自動的にトリミングする方法はありますか?

例えば:

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

になる

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

これが Label クラスに組み込まれていれば、特にすばらしいと思いますが、それを思い出したようですが、見つかりません!

4

5 に答える 5

9

TextFormatFlags.PathEllipsisフラグでTextRenderer.DrawTextを使用する

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()ラベルごとに手動でイベントを作成するか、継承されたラベルのメソッドをオーバーライドするだけかはわかりませんでした。ただし、最終的な解決策を共有していただきありがとうございます。

于 2008-08-21T16:49:29.640 に答える
4

@ lubos haskoあなたのコードは 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);
于 2008-08-21T17:23:39.933 に答える
3

自分で書くのは難しくありません:

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

拡張メソッドとして追加することもできると思います。

于 2008-08-21T16:49:06.630 に答える
0

ラベルで考えているのは、幅よりも長い場合(オートサイズに設定されていない場合)...を付けるということですが、それは

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

サポートがある場合、おそらく System.IO の Path クラスにあります。

于 2008-08-21T16:48:58.003 に答える
0

System.IO.Path.GetFileName メソッドを使用して、その文字列を短縮された System.IO.Path.GetDirectoryName 文字列に追加できます。

于 2008-08-21T16:49:01.310 に答える