質問

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

例えば:

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

になる

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

これが Label クラスに組み込まれていれば特に素晴らしいでしょう。私はそれを覚えているようですが、見つかりません。

役に立ちましたか?

解決

使用 TextRenderer.DrawTextTextFormatFlags.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