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