1

ListView を使用して Windows エクスプローラーと同様のスタイルで添付ファイル (ファイル/Web リンク) を表示する winforms アプリケーション (C#、.NET 3.5、最終的には 4.0 に移行) があります。

この機能は、アプリケーション ユーザーから好評を博しています。これを edxpand して、列ヘッダーをクリックして詳細ビューを並べ替えるように要求されました (Windows エクスプローラーと同じ)。

Windows エクスプローラーの並べ替え

これが私が目指している並べ替えのスタイルです (三角形のグリフを使用して並べ替え方向を示します)

列の ImageKey プロパティを使用することで、これを達成することに近づきました。

if (lvAttachments.ListViewItemSorter != null)
     {
        lvAttachments.Sort();

        if (lvwColumnSorter != null)
        {
           if (lvwColumnSorter.Order == System.Windows.Forms.SortOrder.Ascending)
              lvAttachments.Columns[lvwColumnSorter.SortColumn].ImageKey = "sortAsc";
           if (lvwColumnSorter.Order == System.Windows.Forms.SortOrder.Descending)
              lvAttachments.Columns[lvwColumnSorter.SortColumn].ImageKey = "sortDesc";
        }
     }

残念ながら、画像はテキストの右側ではなく左側に表示されます。

ここに画像の説明を入力

ColumnHeader TextAlign プロパティが Left に設定されています。デザイナーで使用できる他のプロパティはほとんどなく、どれも役に立たないようです。

左揃えで画像をテキストの右側に表示することが可能かどうか、または使用する必要がある別のアプローチがあるかどうかを誰かが知っていますか?

私が見つけたオプションの 1 つは、ヘッダー テキストで Unicode グリフを使用することです。ただし、Unicode グリフはあまり良くないので、可能であればこれは避けたいと思います。

4

1 に答える 1

0

その方法を私が知っている唯一の方法は、PInvoke を使用することです。

    [StructLayoutAttribute(LayoutKind.Sequential)]
    internal struct LV_COLUMN
    {
        public UInt32 mask;
        public Int32 fmt;
        public Int32 cx;
        public String pszText;
        public Int32 cchTextMax;
        public Int32 iSubItem;
        public Int32 iImage;
        public Int32 iOrder;
    }

    [DllImport("User32", EntryPoint = "SendMessage", CharSet = CharSet.Auto)]
    internal static extern IntPtr SendLVColMessage(IntPtr hWnd, UInt32 msg, UInt32 wParam, ref LV_COLUMN lParam);

    internal const uint LVCF_FMT = 0x1;
    internal const uint LVCF_IMAGE = 0x10;
    internal const int LVCFMT_IMAGE = 0x800;
    internal const int LVCFMT_BITMAP_ON_RIGHT = 0x1000;

    // Get the old format flags
    col.mask = LVNative.LVCF_FMT;
    LVNative.SendLVColMessage(lvSessions.Handle, LVNative.LVM_GETCOLUMN, (UInt32)iCol, ref col);

    // Set the new format flags
    col.mask = LVNative.LVCF_FMT | LVNative.LVCF_IMAGE;
    col.fmt |= LVNative.LVCFMT_IMAGE | LVNative.LVCFMT_BITMAP_ON_RIGHT;
    col.iImage = (bAscending) ? (int)SessionIcons.SortAscending : (int)SessionIcons.SortDescending;
    LVNative.SendLVColMessage(lvSessions.Handle, LVNative.LVM_SETCOLUMN, (UInt32)iCol, ref col);
于 2012-10-31T19:20:34.150 に答える