Forçar a exibição de barras de rolagem em um ListView?

O fundo: A maioria de nós conhece oSysListView32 controle comum e o invólucro equivalenteListView classe fornecida pelo.NET Framework. Um pouco de profundidade em suas partes internas mostra que as barras de rolagem fornecidas para rolar seu conteúdo sãoNÃO se controla, mas são gerenciados peloSysListView32 ao controle.

O objetivo: Sempre desenhe barras de rolagem, mesmo se não houverListViewItems para exibir ou ter muito poucos, de modo que nenhuma barra de rolagem seja necessária; tipo como imitando oRichTextBox classe com a suaScrollBars propriedade definida comoForcedBoth. Ou meio assimListBox:

Os problemas):

.INTERNET temNÃO açúcar para barras de rolagem dentro de umListView.A documentação do Win32 não indica quandoaparecer esconder e / ouhabilitar desabilitar barras de rolagem.

Minhas soluções alternativas:

override aWndProc em uma classe derivada e lidar com suaWM_HSCROLL eWM_VSCROLL mensagens de acordo com as etapas 2 e 3.Ligarbase.WndProc para executar o processamento realmente necessário da funcionalidade de rolagem.Crie um método comoWmScroll e fazermeu processando nele imediatamenteafter base.WndProc Voltou.Isso consiste em uma chamada p / invoke paraGetScrollInfo. Determine se uma barra de rolagem é realmente necessária. Se não for, ligueShowScrollBar eEnableScrollBar com os valores necessários para desenhar barras de rolagem visivelmente desativadas.

Problemas com a solução alternativa:

Mal funciona. As barras de rolagem são exibidas e desativadas, mas são como asTema clássico do Windows.Oculta os botões de recolhimento de cadaListViewGroup, tornando-os inúteis!

A imagem descritiva:

A tão esperada questão real:

Como forçar as barras de rolagem a serem sempre Visible dentro de um ListView independentemente do número de ListViewItems e desative-os se forem desnecessários, evitando ao mesmo tempo erro de cálculo de tamanho (para exibir os botões de recolhimento do ListViewGroups) e deterioração do tema?

Respostas sem código e respostas com código emC #, VB.NET eC ++ / CLR são bem-vindos. Se você postar código em qualquer outro idioma suportado pelo .NET, também deixe um link para um site de conversão de código que eu possa usar se o código parecer incompreensível.

questionAnswers(1)

yourAnswerToTheQuestion