C# ListView отключить горизонтальную полосу прокрутки

Есть ли способ остановить горизонтальную полосу прокрутки в списке? Я хочу, чтобы вертикальная полоса прокрутки отображалась при необходимости, но я хочу, чтобы горизонтальная полоса прокрутки никогда не появлялась.

Я полагаю, это будет как-то связано с WndProc?

Спасибо

6 ответов

Решение

Вы можете попробовать что-то вроде этого, я однажды использовал в проекте, и это сработало:

[DllImport ("user32")]
private static extern long ShowScrollBar (long hwnd , long wBar, long bShow);
long SB_HORZ = 0;
long SB_VERT = 1;
long SB_BOTH = 3;

private void HideHorizontalScrollBar ()
{
    ShowScrollBar(listView1.Handle.ToInt64(), SB_HORZ, 0);
}

Надеюсь, поможет.

Существует гораздо более простой способ устранить нижнюю полосу прокрутки и получить вертикальное отображение. Он состоит в том, чтобы удостовериться, что заголовок и, если заголовок отсутствует, строки имеют ширину listview.Width - 4 и если вертикальная полоса прокрутки показывает, то listview.Width - Scrollbar.Width - 4;

следующий код демонстрирует, как:

lv.Columns[0].Width = Width - 4 - SystemInformation.VerticalScrollBarWidth;

Ответ @bennyyboi небезопасен, так как разбалансирует стек. вместо этого вы должны использовать следующий код для DllImport:

[System.Runtime.InteropServices.DllImport("user32", CallingConvention=System.Runtime.InteropServices.CallingConvention.Winapi)]
[return: System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.Bool)]

private static extern bool ShowScrollBar(IntPtr hwnd, int wBar, [System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.Bool)] bool bShow);

Андреас Рейфф рассказывает об этом в своем комментарии выше после того, как снова посмотрел, так что я думаю, что здесь все красиво отформатировано.

Наилучшим решением является принятый ответ, который был дан здесь: Как скрыть вертикальную полосу прокрутки в элементе управления.NET ListView в режиме сведений.

Он работает отлично, и вам не нужны такие хитрости, как регулировка ширины столбца. Кроме того, вы отключаете полосу прокрутки прямо при создании элемента управления.

Недостатком является то, что вы должны создать свой собственный класс представления списка, который происходит от System.Windows.Forms.ListView переопределить WndProc, Но это путь.

Чтобы отключить горизонтальную полосу прокрутки, не забудьте использовать WS_HSCROLL вместо WS_VSCROLL (который был использован в связанном ответе). Значение для WS_HSCROLL является 0x00100000,

Если вы хотите, чтобы представление списка отображало значок или значение как горизонтальное, просто нужно установить выравнивание по левому краю.

Лично я искал что-то очень похожее, но не смог узнать, как удалить ОБЕЕ полосы прокрутки, но при этом заставить колесо мыши работать для просмотра списка. Я понимаю, что это не совсем относится к исходному заданному вопросу, но если кто-то наткнется на эту страницу, желающую удалить обе полосы прокрутки, но при этом иметь функцию вертикальной прокрутки, вот код, который сделает именно это! Я порылся в сети и не смог найти ответа, а заданный здесь вопрос очень похож, поэтому, пожалуйста, не ненавидьте меня за то, что я разместил это здесь. И не волнуйтесь из-за моего цикла while (1==1), ха-ха! Кроме того, это код задания исправления из многих источников, включая мой собственный, поэтому я не могу полностью доверять ему и не знаю первоначальных источников некоторых из них. Просто создайте новый пользовательский элемент управления, используя этот код (измените пространство имен на то, что вы хотите). И вы можете просто изменить файл design.cs в соответствии с формой, в которой он находится, и ссылаться на этот элемент управления вместо исходного ListView (2 строки кода). Убедитесь, что для параметра Scrollable установлено значение true, но также установите для ScrollOverride значение true, иначе он будет действовать как обычный ListView.

      using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace LancourWestbrook.Controls
{
    public partial class TPListView : ListView
    {
        [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);

        const int GWL_STYLE = -16;
        const int WS_VSCROLL = 0x00200000;
        const int WS_HSCROLL = 0x00100000;
        const int WM_MOUSEWHEEL = 0x20a;
        const int WM_NCCALCSIZE = 0x83;

        public TPListView()
        {
            InitializeComponent();
        }

        public TPListView(IContainer container)
        {
            container.Add(this);
            InitializeComponent();
        }

        private int? LastItemIndexInView
        {
            get
            {
                if (this.Items == null || this.Items.Count <= 0)
                {
                    return null;
                }
                List<int> items = new List<int>();

                int topIndex = this.TopItem.Index;
                int currentIndex = topIndex;
                items.Add(topIndex);
                while (1 == 1)
                {
                    currentIndex++;
                    if (this.Items.Count - 1 < currentIndex)
                    {
                        break;
                    }
                    if (this.Items[currentIndex].Bounds.IntersectsWith(this.ClientRectangle))
                    {
                        items.Add(currentIndex);
                    }
                    else
                    {
                        break;
                    }
                }
                return currentIndex;
            }
        }

        public bool ScrollOverride { get; set; }

        protected override void WndProc(ref Message m)
        {            
            if (ScrollOverride == false)
            {
                base.WndProc(ref m);
                return;
            }
            switch (m.Msg)
            {
                case WM_MOUSEWHEEL:
                    if (this.Items == null || this.Items.Count <= 0)
                    {
                        break;
                    }
                    var zDelta = (short)HIWORD(m.WParam);
                    if (zDelta < 0)
                    {
                        //Scroll Downwards
                        int? lastItemInView = LastItemIndexInView;
                        if (lastItemInView.HasValue && this.Items.Count > lastItemInView.Value + 1)
                        {
                            this.Items[lastItemInView.Value + 1].EnsureVisible();
                        }
                        else if (this.Items.Count > 0)
                        {
                            this.Items[this.Items.Count - 1].EnsureVisible();
                        }
                    }
                    else if (zDelta > 0)
                    {
                        //Scroll Upwards
                        int topItemInView = this.TopItem.Index;
                        if (topItemInView > 0)
                        {
                            this.Items[topItemInView - 1].EnsureVisible();
                        }
                    }
                    break;
                case WM_NCCALCSIZE:
                    int style = (int)GetWindowLong(this.Handle, GWL_STYLE);
                    if ((style & WS_VSCROLL) == WS_VSCROLL)
                        SetWindowLong(this.Handle, GWL_STYLE, style & ~WS_VSCROLL);
                    if ((style & WS_HSCROLL) == WS_HSCROLL)
                        SetWindowLong(this.Handle, GWL_STYLE, style & ~WS_HSCROLL);                    
                    base.WndProc(ref m);
                    break;
                default:
                    base.WndProc(ref m);
                    break;
            }
        }


        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);
        }

        internal static ushort HIWORD(IntPtr dwValue)
        {
            return (ushort)((((long)dwValue) >> 0x10) & 0xffff);
        }
    }
}

Может быть, кто-нибудь также может добавить код для щелчка и удержания колесика мыши для горизонтальной прокрутки!

Другие вопросы по тегам