Как скрыть вертикальную полосу прокрутки в Управлении ListView.NET в режиме Details

Я сделал, чтобы ListView управлял в режиме Details с отдельным столбцом. Именно на форме предназначен, чтобы только использоваться с клавиатурой, главным образом с/стрелки вниз для прокрутки и войти в выбор. Таким образом, я не должен действительно иметь полос прокрутки и был бы точно так же, как они для не показа для более чистого взгляда. Однако, когда я установил ListView. Свойство с возможностью прокрутки ко лжи, я могу все еще переместить выбранный пункт вверх и вниз, но как только это перемещается в объект не в настоящее время в поле зрения, список не переместится для показа того объекта. Я попытался использовать EnsureVisible, чтобы программно прокрутить список, но он ничего не делает когда в этом режиме.

Там какой-либо путь состоит в том, чтобы вручную переместить список вверх и вниз для прокрутки, но не имея существующей полосы прокрутки?

8
задан Hans Passant 21 March 2010 в 22:44
поделиться

4 ответа

Это непросто, но можно. Если вы попытаетесь скрыть полосу прокрутки с помощью ShowScrollBar, ListView просто вернет ее обратно. Так что вам нужно сделать что-то более коварное.

Вам нужно будет перехватить сообщение WM_NCCALCSIZE и там отключить стиль вертикальной прокрутки. Всякий раз, когда listview пытается включить его снова, вы снова отключите его в этом обработчике.

public class ListViewWithoutScrollBar : ListView
{
    protected override void WndProc(ref Message m) {
        switch (m.Msg) {
            case 0x83: // WM_NCCALCSIZE
                int style = (int)GetWindowLong(this.Handle, GWL_STYLE);
                if ((style & WS_VSCROLL) == WS_VSCROLL)
                    SetWindowLong(this.Handle, GWL_STYLE, style & ~WS_VSCROLL);
                base.WndProc(ref m);
                break;
            default:
                base.WndProc(ref m);
                break;
        }
    }
    const int GWL_STYLE = -16;
    const int WS_VSCROLL = 0x00200000;

    public static int GetWindowLong(IntPtr hWnd, int nIndex) {
        if (IntPtr.Size == 4)
            return (int)GetWindowLong32(hWnd, nIndex);
        else
            return (int)(long)GetWindowLongPtr64(hWnd, nIndex);
    }

    public static int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong) {
        if (IntPtr.Size == 4)
            return (int)SetWindowLongPtr32(hWnd, nIndex, dwNewLong);
        else
            return (int)(long)SetWindowLongPtr64(hWnd, nIndex, dwNewLong);
    }

    [DllImport("user32.dll", EntryPoint = "GetWindowLong", CharSet = CharSet.Auto)]
    public static extern IntPtr GetWindowLong32(IntPtr hWnd, int nIndex);

    [DllImport("user32.dll", EntryPoint = "GetWindowLongPtr", CharSet = CharSet.Auto)]
    public static extern IntPtr GetWindowLongPtr64(IntPtr hWnd, int nIndex);

    [DllImport("user32.dll", EntryPoint = "SetWindowLong", CharSet = CharSet.Auto)]
    public static extern IntPtr SetWindowLongPtr32(IntPtr hWnd, int nIndex, int dwNewLong);

    [DllImport("user32.dll", EntryPoint = "SetWindowLongPtr", CharSet = CharSet.Auto)]
    public static extern IntPtr SetWindowLongPtr64(IntPtr hWnd, int nIndex, int dwNewLong);
}

Это даст вам ListView без полос прокрутки, которые все еще прокручиваются, когда вы используете клавиши со стрелками для изменения выбора.

13
ответ дан 5 December 2019 в 11:23
поделиться

Поскольку ShowScrollBar не работал, возможно, это поможет:

[DllImport("user32.dll", CharSet = CharSet.Auto)]
static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, int wParam, int lParam);

private const int WM_VSCROLL = 0x115;
private const int SB_LINEDOWN = 1;

public Form1()
{
    InitializeComponent();
    for (int i = 0; i < 100; i++)
        listView1.Items.Add("foo" + i);
    listView1.Scrollable = false;
}

private void listView1_SelectedIndexChanged(object sender, EventArgs e)
{
    SendMessage(listView1.Handle, WM_VSCROLL, SB_LINEDOWN, 0);
}
1
ответ дан 5 December 2019 в 11:23
поделиться

Вызвать метод API ShowScrollBar .

0
ответ дан 5 December 2019 в 11:23
поделиться

Если ShowScrollBar не работает, я не знаю, как это сделать.

Вы можете поместить ListView на панель и сделать ListView шире, чем панель, так что полоса прокрутки будет обрезана (проверьте SystemInformation.VerticalScrollBarWidth ), но это ужасающе уродливое взломать.

0
ответ дан 5 December 2019 в 11:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: