C# Itemsstackpanel禁用滚动

C# Itemsstackpanel禁用滚动,c#,xaml,uwp,C#,Xaml,Uwp,我在Listview控件中有一个Itemsstackpanel。我想在用户靠近页面边缘时触发PointerHeelChanged事件。 当我将事件放在itemsstackpanel上时,将禁用我通过鼠标滚轮滚动的能力。如果事件在Listview或网格本身上,则只有在Listview中未加载任何项时,事件才会起作用。 这是故意的行为还是我遗漏了一些重要信息? 我进行了研究,但没有发现导致这个问题或行为的原因 下面是我的XAML: <Grid Background="Gray

我在Listview控件中有一个Itemsstackpanel。我想在用户靠近页面边缘时触发PointerHeelChanged事件。 当我将事件放在itemsstackpanel上时,将禁用我通过鼠标滚轮滚动的能力。如果事件在Listview或网格本身上,则只有在Listview中未加载任何项时,事件才会起作用。 这是故意的行为还是我遗漏了一些重要信息? 我进行了研究,但没有发现导致这个问题或行为的原因

下面是我的XAML:

    <Grid Background="Gray">
    <ProgressRing x:Name="progress" IsActive="False" x:FieldModifier="public" Foreground="Black" Height="200" Width="200"/>
    <ListView x:Name="ListViewControl" x:FieldModifier="public" Margin="10,10,10,10" ScrollViewer.HorizontalScrollBarVisibility="Disabled" 
              ScrollViewer.ZoomMode="Enabled" ScrollViewer.VerticalScrollBarVisibility="Visible" DataFetchSize="10" IncrementalLoadingTrigger="Edge" 
              IncrementalLoadingThreshold="2" ShowsScrollingPlaceholders="True" BorderThickness="1" IsItemClickEnabled="False" SelectionMode="None" PointerEntered="ListViewControl_PointerEntered">
        <ListView.ItemContainerStyle>
            <Style TargetType="ListViewItem">
                <Setter Property="HorizontalContentAlignment" Value="Center"/>
            </Style>
        </ListView.ItemContainerStyle>
        <ListView.ItemsPanel>
            <ItemsPanelTemplate>
                <ItemsStackPanel CacheLength="0" Orientation="Vertical" Background="White" PointerWheelChanged="Grid_PointerWheelChanged"/>
            </ItemsPanelTemplate>
        </ListView.ItemsPanel>

    </ListView>


</Grid>

以及背后的代码(目前不只是尝试让它工作):

private void ItemsStackPanel_pointerheelchanged(对象发送方,PointerRoutedEventArgs e)
{
e、 已处理=正确;
PointerPoint=e.GetCurrentPoint(ListViewControl);
浮动滚动距离=pointerPoint.Properties.MouseWheelDelta;
如果(滚动距离>=120)
{
//在特定鼠标滚轮点将页面加载到当前页面上方
}

else if(scrolledDistanceListView的默认
ControlTemplate
包含
ScrollViewer
控件。
指针的更改是一个相对低级的事件,将被
ScrollViewer
拦截

如果要监视滚动距离的变化,建议不要使用
pointerheelchanged
事件。您可以收听
ScrollViewer.ViewChanged
事件,并使用
ScrollViewer.VerticalOffset
确定垂直滚动距离

我们可以创建自定义ListView来实现这一点:

CustomListView.cs

公共类CustomListView:ListView { 私有ScrollViewer\u ScrollViewer; 公共事件处理程序视图已更改; 公共CustomListView() { this.DefaultStyleKey=typeof(ListView); } 受保护的覆盖无效OnApplyTemplate() { _scrollViewer=GetTemplateChild(“scrollViewer”)作为scrollViewer; 如果(_scrollViewer!=null) { _scrollViewer.ViewChanged+=CustomViewChange; } base.OnApplyTemplate(); } 私有void CustomViewChange(对象发送者,ScrollViewServiceChangedEventArgs e) { ViewChanged?.Invoke(发送方,e); } }
用法


private void ListViewControl\u ViewChanged(对象发送者,ScrollViewServiceChangedEventArgs e)
{
var scrollViewer=发送方作为scrollViewer;
双滚动高度=scrollViewer.VerticalOffset;
如果(滚动高度>120)
{
//做点什么。。。
}
其他的
{
//做点什么。。。
}
}
    private  void ItemsStackPanel_PointerWheelChanged(object sender, PointerRoutedEventArgs e)
    {
        e.Handled = true;

       
        PointerPoint pointerPoint = e.GetCurrentPoint(ListViewControl);

        
        float scrolledDistance = pointerPoint.Properties.MouseWheelDelta;

   
        if (scrolledDistance >=120)
        {
            //Load Page above current Page at a certain mousewheel point

        }
        else if (scrolledDistance <= -120 )
        {
            //Load Page below current Page at certain mousewheel point
        }
        else
        {
            //do some other stuff
        }
    }