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 ListViewGroup
s) 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.