Child elements of scrollviewer preventing scrolling with mouse wheel?

前端 未结 4 1978

I\'m having a problem getting mouse wheel scrolling to work in the following XAML, which I have simplified for clarity:



        
相关标签:
4条回答
  • 2020-12-02 18:58

    I know it's a little late but I have another solution that worked for me. I switched out my stackpanel/listbox for an itemscontrol/grid. Not sure why the scroll events work properly but they do in my case.

    <ScrollViewer VerticalScrollBarVisibility="Auto" PreviewMouseWheel="ScrollViewer_PreviewMouseWheel">
                    <StackPanel Orientation="Vertical">
                        <ListBox ItemsSource="{Binding DrillingConfigs}" Margin="0,5,0,0">
                            <ListBox.ItemTemplate>
                                <DataTemplate>
    

    became

    <ScrollViewer VerticalScrollBarVisibility="Auto" PreviewMouseWheel="ScrollViewer_PreviewMouseWheel">
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="*" />
                <RowDefinition Height="Auto" />
            </Grid.RowDefinitions>
            <ItemsControl ItemsSource="{Binding DrillingConfigs}" Margin="0,5,0,0" Grid.Row="0">
                <ItemsControl.ItemTemplate>
                    <DataTemplate>
    
    0 讨论(0)
  • 2020-12-02 19:02

    Another way of implementing this, is by creating you own ScrollViewer like this:

    public class MyScrollViewer : ScrollViewer
    {
        protected override void OnMouseWheel(MouseWheelEventArgs e)
        {
            var parentElement = Parent as UIElement;
            if (parentElement != null)
            {
                if ((e.Delta > 0 && VerticalOffset == 0) ||
                    (e.Delta < 0 && VerticalOffset == ScrollableHeight))
                {
                    e.Handled = true;
    
                    var routedArgs = new MouseWheelEventArgs(e.MouseDevice, e.Timestamp, e.Delta);
                    routedArgs.RoutedEvent = UIElement.MouseWheelEvent;
                    parentElement.RaiseEvent(routedArgs);
                }
            }
    
            base.OnMouseWheel(e);
        }
    }
    
    0 讨论(0)
  • 2020-12-02 19:04

    You can also create a behavior and attach it to the parent control (in which the scroll events should bubble through).

    // Used on sub-controls of an expander to bubble the mouse wheel scroll event up 
    public sealed class BubbleScrollEvent : Behavior<UIElement>
    {
        protected override void OnAttached()
        {
            base.OnAttached();
            AssociatedObject.PreviewMouseWheel += AssociatedObject_PreviewMouseWheel;
        }
    
        protected override void OnDetaching()
        {
            AssociatedObject.PreviewMouseWheel -= AssociatedObject_PreviewMouseWheel;
            base.OnDetaching();
        }
    
        void AssociatedObject_PreviewMouseWheel(object sender, MouseWheelEventArgs e)
        {
            e.Handled = true;
            var e2 = new MouseWheelEventArgs(e.MouseDevice, e.Timestamp, e.Delta);
            e2.RoutedEvent = UIElement.MouseWheelEvent;
            AssociatedObject.RaiseEvent(e2);
        }
    }
    
    <SomePanel>
                <i:Interaction.Behaviors>
                    <viewsCommon:BubbleScrollEvent />
                </i:Interaction.Behaviors>
    </SomePanel>
    
    0 讨论(0)
  • 2020-12-02 19:09

    Specifying a ControlTemplate for the Listbox which doesn't include a ScrollViewer solves the problem. See this answer and these two MSDN pages for more information:

    ControlTemplate

    ListBox Styles and Templates

    0 讨论(0)
提交回复
热议问题