web-dev-qa-db-ja.com

コンテンツ文字列の幅がListBoxの幅よりも大きい場合、Winforms DotNet ListBoxアイテムをワードラップしますか?

ええと、うーん、これは、いくつかの行のサイズを2行にする必要があることを意味します。上司は、表示されるテキストを幅に合わせて制限し、水平スクロールバーが気に入らないよりも、これがより簡単な解決策だと考えています> _ <

14
Kosmos
lst.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawVariable;
lst.MeasureItem += lst_MeasureItem;
lst.DrawItem += lst_DrawItem;

private void lst_MeasureItem(object sender, MeasureItemEventArgs e)
{
    e.ItemHeight = (int)e.Graphics.MeasureString(lst.Items[e.Index].ToString(), lst.Font, lst.Width).Height;
}

private void lst_DrawItem(object sender, DrawItemEventArgs e)
{
    e.DrawBackground();
    e.DrawFocusRectangle();
    e.Graphics.DrawString(lst.Items[e.Index].ToString(), e.Font, new SolidBrush(e.ForeColor), e.Bounds);
}
36
Kosmos
private void lst_MeasureItem(object sender, MeasureItemEventArgs e)
{
    e.ItemHeight = (int)e.Graphics.MeasureString(lst.Items[e.Index].ToString(), lst.Font, lst.Width).Height;
}

private void lst_DrawItem(object sender, DrawItemEventArgs e)
{
    e.DrawBackground();
    e.DrawFocusRectangle();
    e.Graphics.DrawString(lst.Items[e.Index].ToString(), e.Font, new SolidBrush(e.ForeColor), e.Bounds);
}

データバインディング時に適切な表示メンバーを表示するには、

lst.Items[e.Index].ToString()

プロパティのキャストバージョンを使用します。したがって、バインディングソースがクラスオブジェクトCarの場合、次のようになります。

((Car)lst.Items[e.Index]).YourDisplayProperty

次に、上記の関数は文字列を適切に測定して描画できます。 :)

1
Rich Guernsey

バインディングを正しくするには、必ずチェック「lst.Items.Count> 0」をlst_MeasureItem関数に追加してください。これが私の例です:

 if (lst.Items.Count > 0)
 {
    e.ItemHeight = (int)e.Graphics.MeasureString(lst.Items[e.Index].ToString(), lst.Font, lst.Width).Height;
 }

その後、他のすべてがうまく機能しているようです。

0
user2419223

役立つリンク

この答えをチェックしてください。リストボックスのテンプレートを、テキストをラップするテキストブロックでオーバーライドします。お役に立てば幸いです。あなたの問題を解決するために、私はあなたが追加するべきだと思います:ScrollViewer.Horizo​​ntalScrollBarVisibility = "Disabled"。見つかりました ここ

0
Andrei Neculai