質問
.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 文字列に追加することができます。