.NET でパス文字列を自動的にトリミングする方法はありますか?
例えば:
C:\Documents and Settings\nick\My Documents\Tests\demo data\demo data.emx
になる
C:\Documents...\demo data.emx
これが Label クラスに組み込まれていれば、特にすばらしいと思いますが、それを思い出したようですが、見つかりません!
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()
ラベルごとに手動でイベントを作成するか、継承されたラベルのメソッドをオーバーライドするだけかはわかりませんでした。ただし、最終的な解決策を共有していただきありがとうございます。
@ 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);
自分で書くのは難しくありません:
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 文字列に追加できます。