c# - La rueda del mouse ScrollViewer no funciona
.net wpf (5)
Actualmente estoy trabajando en mi primer proyecto de WPF y estoy tratando de hacer una vista de lista desplazable. Al principio pensé que esto podría hacerse fácilmente simplemente limitando el ancho y alto de la lista de la lista y forzando así que una barra de desplazamiento aparezca automáticamente cada vez que el contenido exceda su espacio. Esto parecía estar bien al principio, pero debido al evento PreviewMouseDown (que permite arrastrar los elementos de la lista) no funciona después de seleccionar un elemento.
Segundo intento (usando ScrollViewer)
<ScrollViewer>
<ListView ItemsSource="{Binding FileViewModels}"
PreviewMouseDown="ListView_MouseMove"
Height="450" Width="200"/>
</ScrollViewer>
Por supuesto, esto dio lugar a una segunda barra de desplazamiento cada vez que el contenido de la lista se hizo más grande que su altura máxima. Y arrastrar la barra todavía no funcionaba después de seleccionar un elemento.
Tercer intento (bastante insensato) (deshabilitar el duplicado de la barra de desplazamiento)
<ScrollViewer>
<ListView ItemsSource="{Binding FileViewModels}"
PreviewMouseDown="ListView_MouseMove"
Height="450" Width="200"
ScrollViewer.VerticalScrollBarVisibility="Disabled"
ScrollViewer.HorizontalScrollBarVisibility="Disabled"/>
</ScrollViewer>
Esto eliminó el duplicado de la barra de desplazamiento y habilitó el desplazamiento a través de la rueda del mouse, pero deshabilitó la barra de desplazamiento, por lo que no se podía mover haciendo clic y arrastrándolo.
Cuarto intento (tamaño constante del ScrollViewer)
<ScrollViewer Height="450" Width="200">
<ListView ItemsSource="{Binding FileViewModels}"
PreviewMouseDown="ListView_MouseMove"/>
</ScrollViewer>
Se eliminó la restricción de ancho / altura de ListView y se movió al ScrollViewer. Esto habilita la barra de desplazamiento y elimina el duplicado. Desafortunadamente, la rueda del mouse ya no funciona (arrastrar la barra de desplazamiento funciona bien).
¿Podría alguien explicarme por qué la rueda del mouse ya no funciona y cómo solucionarlo?
Editar Quizás debería volver a mi primera solución. Obviamente, la plantilla de ListView ya contiene un ScrollViewer. El problema restante sería que no puedo arrastrar la barra de desplazamiento después de seleccionar un elemento debido al evento PreviewMouseDown manejado (el desplazamiento a través de la rueda del mouse aún funciona en ese caso). ¿Debo manejar el arrastre de elementos de manera diferente (funcionó bien para mí, antes de querer agregar una barra de desplazamiento)? ¿O hay una manera de detectar si el cursor está sobre la barra de desplazamiento (entonces podría deseleccionar el elemento que permite el desplazamiento)? ¿O hay alguna otra sugerencia?
Esta sería probablemente la solución más cómoda:
<ListView.Template>
<ControlTemplate>
<ScrollViewer>
<ItemsPresenter></ItemsPresenter>
</ScrollViewer>
</ControlTemplate>
</ListView.Template>
Esto puede ayudarte ...
private void ListViewScrollViewer_PreviewMouseWheel(object sender, System.Windows.Input.MouseWheelEventArgs e)
{
ScrollViewer scv = (ScrollViewer)sender;
scv.ScrollToVerticalOffset(scv.VerticalOffset - e.Delta);
e.Handled = true;
}
Para mí esto funcionó:
<ListView.Template>
<ControlTemplate>
<!-- Empty template to allow ScrollViewer to capture mouse scroll -->
<ItemsPresenter />
</ControlTemplate>
</ListView.Template>
en lugar de esto:
<ListView.Template>
<ControlTemplate>
<ScrollViewer>
<ItemsPresenter></ItemsPresenter>
</ScrollViewer>
</ControlTemplate>
</ListView.Template>
en mi caso :
<ScrollViewer ScrollViewer.CanContentScroll="True" ScrollViewer.VerticalScrollBarVisibility="Disabled" ScrollViewer.HorizontalScrollBarVisibility="Auto" >
<DataGrid x:Name="dataGrid" SelectionMode="Single" ItemsSource="{Binding}" SelectedValuePath="{Binding Item}" AutoGenerateColumns="True">
</DataGrid>
</ScrollViewer>
el diseño estaba en deshabilitar el atributo VerticalScrollBarVisibility en el ámbito externo, es decir, en ScrollViewer
<ScrollViewer Background="Transparent">
Si Background es nulo, la rueda del mouse no funcionará en ScrollViewer. Puede establecer el fondo en Transparente o algún otro valor.