手势识别 - 操作事件不会触发
Gesture Recognition - Manipulation Events do not fire
我正在尝试在 Windows 10 移动 (UW) 应用程序中使用 ManipulationStarted 和 ManipulationDelta 事件实现手势识别。但是有一个问题 - 他们不开火。
最有可能的问题是我的 xaml 视图过于复杂(我在 ListView 中有 HorizontalyScrollable GridView - 为了启用垂直滚动,它全部打包在 ScrollViewer 中)。但是我尝试将这些事件添加到所有容器中,但它们仍然没有触发。
有人have/know有什么解决方案吗?下面是我的 xaml 页面树:
<ScrollViewer Grid.Row="2" x:Name="SubscribersView" ManipulationStarted="SubscribersView_ManipulationStarted" ManipulationDelta="SubscribersView_ManipulationDelta">
(......)
<ListView
Margin="0"
Grid.Row="0"
SelectionMode="None"
IsItemClickEnabled="True"
ScrollViewer.HorizontalScrollMode="Disabled"
ScrollViewer.VerticalScrollMode="Disabled"
HorizontalAlignment="Stretch" >
<ListView.ItemTemplate>
<DataTemplate>
<Grid>
(......)
<GridView Grid.Row="1"
HorizontalAlignment="Stretch"
Margin="-10"
SelectionMode="None"
IsItemClickEnabled="True"
ScrollViewer.HorizontalScrollMode="Enabled"
ScrollViewer.VerticalScrollMode="Disabled"
ScrollViewer.HorizontalScrollBarVisibility="Visible">
<GridView.ItemsPanel>
<ItemsPanelTemplate>
<VirtualizingStackPanel Orientation="Horizontal"></VirtualizingStackPanel>
</ItemsPanelTemplate>
</GridView.ItemsPanel>
</GridView>
</Grid>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
对于您尝试处理操作事件的 ScrollViewer
,将 ManipulationMode 设置为全部 - 或根据需要设置。
阅读更多:
https://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.uielement.manipulationmode
我找到了解决方案——我使用了 scrollviwer 的 ViewChanged :以下是解决方案
private void SubscribersView_ViewChanged(object sender, ScrollViewerViewChangedEventArgs e)
{
var sv = sender as ScrollViewer;
var verticalOffset = sv.VerticalOffset;
var minVerticalOffset = sv.ExtentHeight - sv.ViewportHeight;
var maxVerticalOffset = sv.ScrollableHeight;
if (maxVerticalOffset < 0 || verticalOffset == maxVerticalOffset || minVerticalOffset <= 0 || verticalOffset <= 0)
{
//reached top or bottom
return;
}
if (verticalOffset > previousVerticalOffset)
{
//Scroll down
if (!popularHidden)
{
MainImageSlideOut.Begin();
popularHidden = true;
}
}
else
{
//Scroll up
if (popularHidden)
{
MainImageSlideIn.Begin();
popularHidden = false;
}
}
previousVerticalOffset = verticalOffset;
}
我正在尝试在 Windows 10 移动 (UW) 应用程序中使用 ManipulationStarted 和 ManipulationDelta 事件实现手势识别。但是有一个问题 - 他们不开火。
最有可能的问题是我的 xaml 视图过于复杂(我在 ListView 中有 HorizontalyScrollable GridView - 为了启用垂直滚动,它全部打包在 ScrollViewer 中)。但是我尝试将这些事件添加到所有容器中,但它们仍然没有触发。
有人have/know有什么解决方案吗?下面是我的 xaml 页面树:
<ScrollViewer Grid.Row="2" x:Name="SubscribersView" ManipulationStarted="SubscribersView_ManipulationStarted" ManipulationDelta="SubscribersView_ManipulationDelta">
(......)
<ListView
Margin="0"
Grid.Row="0"
SelectionMode="None"
IsItemClickEnabled="True"
ScrollViewer.HorizontalScrollMode="Disabled"
ScrollViewer.VerticalScrollMode="Disabled"
HorizontalAlignment="Stretch" >
<ListView.ItemTemplate>
<DataTemplate>
<Grid>
(......)
<GridView Grid.Row="1"
HorizontalAlignment="Stretch"
Margin="-10"
SelectionMode="None"
IsItemClickEnabled="True"
ScrollViewer.HorizontalScrollMode="Enabled"
ScrollViewer.VerticalScrollMode="Disabled"
ScrollViewer.HorizontalScrollBarVisibility="Visible">
<GridView.ItemsPanel>
<ItemsPanelTemplate>
<VirtualizingStackPanel Orientation="Horizontal"></VirtualizingStackPanel>
</ItemsPanelTemplate>
</GridView.ItemsPanel>
</GridView>
</Grid>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
对于您尝试处理操作事件的 ScrollViewer
,将 ManipulationMode 设置为全部 - 或根据需要设置。
阅读更多:
https://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.uielement.manipulationmode
我找到了解决方案——我使用了 scrollviwer 的 ViewChanged :以下是解决方案
private void SubscribersView_ViewChanged(object sender, ScrollViewerViewChangedEventArgs e)
{
var sv = sender as ScrollViewer;
var verticalOffset = sv.VerticalOffset;
var minVerticalOffset = sv.ExtentHeight - sv.ViewportHeight;
var maxVerticalOffset = sv.ScrollableHeight;
if (maxVerticalOffset < 0 || verticalOffset == maxVerticalOffset || minVerticalOffset <= 0 || verticalOffset <= 0)
{
//reached top or bottom
return;
}
if (verticalOffset > previousVerticalOffset)
{
//Scroll down
if (!popularHidden)
{
MainImageSlideOut.Begin();
popularHidden = true;
}
}
else
{
//Scroll up
if (popularHidden)
{
MainImageSlideIn.Begin();
popularHidden = false;
}
}
previousVerticalOffset = verticalOffset;
}