0

ListView一部のサブアイテムの追加コンテンツを描画するためにオーナー描画を使用している があります。

この追加のコンテンツが追加のスペースを占有するため、リスト ビューが列の「自動サイズ変更」幅を誤って計算するようになりました。が小さすぎるようにサイズ変更され、そのリスト ビューのテキストは最後に括弧 (...) を付けてレンダリングされます。

リスト ビューで、自動サイズ変更中に列のサイズを確認するように求める方法はありますか?

4

2 に答える 2

1

列のサイズが自動的に変更されようとしていることを通知する単一のメッセージはありません。しかし、あなたが述べたように、ユーザーがそれをトリガーできる方法は2つだけです。仕切りをダブルクリックする方法とCtrl-Shift-+。これらの両方を傍受して、好きなことをすることができます。

ステップ1:ダブルクリックをインターセプトするには、サブクラス化して通知ListViewをリッスンする必要があります。HDN_DIVIDERDBLCLICK

protected override void WndProc(ref Message m) {
    switch (m.Msg) {
        case 0x4E: // WM_NOTIFY
            if (!this.HandleNotify(ref m))
                base.WndProc(ref m);
            break;
        default:
            base.WndProc(ref m);
            break;
    }
}

protected bool HandleNotify(ref Message m) {

    const int HDN_DIVIDERDBLCLICKW = (HDN_FIRST - 25);

    NativeMethods.NMHEADER nmheader = (NativeMethods.NMHEADER)m.GetLParam(typeof(NativeMethods.NMHEADER));

    switch (nmheader.nhdr.code) {

        case HDN_DIVIDERDBLCLICKW:
            if (nmheader.iItem >= 0 && nmheader.iItem < this.Columns.Count) {
                this.AutoResizeColumn(nmheader.iItem);
                m.Result = (IntPtr)1; // prevent the change from happening
                return true;
            }
            break;

        default:
            break;
    }

    return false;
}

もちろん、あなたはあなたが望むことをするために実装AutoResizeColumn()しなければならないでしょう。

ステップ2。Ctrl-Shift- +をインターセプトするには、をオーバーライドする必要がありますProcessKeyPreviewこの記事では、その方法を説明します。オーバーライドではAutoResizeColumn()、各列を呼び出します。

代替アプローチ

各サブアイテムが、所有者が描画するデータと同じ長さの「W」の文字列になるように作成した場合ListViewItems、コントロールはそれらの文字列を使用して列thisを自動計算します。これはもっと簡単なアプローチかもしれません。

于 2012-05-30T08:08:47.383 に答える
0

次の 2 つのシナリオでは、このように手動で行うことができます。


  • と を修正したい場合minimumWidthmaximumWidth

    ColumnWidthChanging次の場合にこれを使用しますListView

   int minimumWidth = 200;
   int maximumWidth = 500;
   if (e.NewWidth  maximumWidth)
   {
      e.Cancel = true;
      e.NewWidth = maximumWidth;
   }

  • の を固定したい場合はColumnWidthListViewColumn希望のColumnWidth

    ColumnWidthChanging次の場合にこれを使用しますListView

   ListView ColumnList = sender as ListView;
   e.Cancel = true;
   e.NewWidth = ColumnList.Columns[e.ColumnIndex].Width;
于 2012-05-23T16:20:45.320 に答える