如果Scrollbar自动隐藏,如何防止WPF中的ScrollViewer吃掉scroll事件

qco9c6ql  于 2023-05-01  发布在  其他
关注(0)|答案(1)|浏览(219)

我有一个ScrollViewer,它包含了这个窗口中的所有内容,还有一些ItemControls,它们可以根据它们包含的项目数量动态地增长和收缩。我将它们 Package 在ScrollViewers中,并将其高度限制为400,以便ScrollViewers在高度超过400像素时可以滚动。ScrollViewers还包含一些其他的东西,如文本框和按钮,用于创建一个新的项目添加到ItemsControl中,我只想在用户滚动到底部时将其带入视图。

<ScrollViewer>
    <StackPanel Margin="20">
        <ScrollViewer MaxHeight="400" VerticalScrollBarVisibility="Auto">
            <ItemsControl>
                ...                                
            </ItemsControl>  
            <StackPanel Orientation="Horizontal">
                ...
            </StackPanel>
        </ScrollViewer>
        <ScrollViewer MaxHeight="400" VerticalScrollBarVisibility="Auto">
            <ItemsControl>
                ...                                
            </ItemsControl> 
            <StackPanel Orientation="Horizontal">
                ...
            </StackPanel>       
        </ScrollViewer>                    
    </StackPanel>
</ScrollViewer>

现在说说我的问题:当ItemControls小于400像素时,滚动条会自动隐藏,但它仍然会吃掉鼠标滚轮事件。我想要的是,它只是滚动外ScrollViewer代替。
我知道我可以改变ScrollViewer的属性,当它像这样自动隐藏时,但似乎没有一个属性可以阻止它尝试滚动,即使没有什么可滚动的。

<Style TargetType="{x:Type ScrollViewer}">
        <Setter Property="VerticalScrollBarVisibility" Value="Auto"/>
        <Style.Triggers>
            <Trigger Property="ComputedVerticalScrollBarVisibility" Value="Collapsed">
                What do I put here?
            </Trigger>
        </Style.Triggers>
    </Style>

似乎唯一工作的是IsEnabled="False",但也禁用了ScrollViewer中我不想要的所有内容,而IsHittestVisible="False"也有同样的问题,即不允许我与ItemsControl中我需要的任何内容进行交互。
我也尝试过一些东西与PreviewMouseEvent,但没有我尝试似乎工作。

nhhxz33t

nhhxz33t1#

我找不到任何干净的解决方案,只有XAML,但你可以在后面的代码中重新路由事件。
自动上设置子级的VerticalScrollBarVisibility

<Style TargetType="{x:Type ScrollViewer}" x:Key="ScrollviewerChildren">
                <Setter Property="MaxHeight" Value="250"/>
                <Setter Property="VerticalScrollBarVisibility" Value="Auto"/>
            </Style>

然后将相同的事件添加到两个“子项”。(您可以在XAML或后面的代码中执行此操作)

sc1.PreviewMouseWheel += Sc_PreviewMouseWheel;
        sc2.PreviewMouseWheel += Sc_PreviewMouseWheel;

最后,如果ComputedVerticalScrollBarVisibility为“Collapsed”,则使用Delta值调用主滚动查看器的ScrollToVerticalOffset(将其反转)

private void Sc_PreviewMouseWheel(object sender, MouseWheelEventArgs e)
    {
        var s = sender as ScrollViewer;
        if (s.ComputedVerticalScrollBarVisibility == Visibility.Collapsed)
        {
            ParentScrollViewer.ScrollToVerticalOffset(-e.Delta);
        }
    }

相关问题