windows-8 – ScrollViewer和处理子元素上的操作事件

我使用C#/ XAML创建了一个Windows 8商店应用程序.我的界面包括一个可滚动的列表,使用ScrollViewer进行渲染.我希望能够处理列表中元素的操作事件,但是,将列表元素上的ManipulationMode设置为None以外的任何内容都会导致我的列表不再滚动.

这是UI的简化版本:

<ScrollViewer>
  <Border/> <!-- these contain child content -->
  <Border/>
  <Border/>
  <!-- Set ManipulationMode on an element in order to receive manipulation events -->
  <!-- This causes the scroll viewer to stop working! -->
  <Border ManipulationMode="All"
          ManipulationDelta="..."/>
  <Border/>
  <Border/>
</ScrollViewer>

据我所知,WinRT ScrollViewer出于性能原因使用了一个特殊的ManipulationMode系统,但是我希望有一个垂直滚动列表,其中包含响应水平操作/手势的元素.任何人都可以想到一个可以实现这一目标的创造性解决方案吗?

我所做的是在ScrollViewer顶部放置一个透明矩形并处理那里的操作.当我发现操作应滚动ScrollViewer时 – 我使用ScrollToHorizo​​ntal / VerticalOffset()方法滚动ScrollViewer.在ManipulationStarted上我也使用VisualTreeHelper.FindElementsInHostCoordinates检查我可以操作哪个项目然后我可以根据各种条件决定是否操作该项目.这是相当多的自定义代码.当用户尝试拖动远离最小/最大偏移量以模仿ScrollViewer默认行为,处理鼠标滚轮等时,您还需要更新ScrollViewer中ScrollContentPresenter的RenderTransform.当然,您无法处理任何事情.不幸的是,我找不到更好的方法,如果有人找到,我感兴趣.

编辑*我在尝试回答another similar question时想到的另一个解决方案是使用另一个ScrollViewer作为子项并使用其ViewChanged事件而不是操作事件.

编辑2 *

另外,对于Windows 8.1,您可以获得ManipulationModes.System,它与其他模式结合使用,可以让您处理ScrollViewer内部的操作.然后,一旦您希望其父ScrollViewers停止处理pan& zoom操作,您就可以在受控元素上调用CancelDirectManipulations().

相关文章

(1)when you ping a computer from itsafe,the ping command should return the local IP address. (...
1、点击win菜单,点击设置图标 2、选择系统选项 3、选择应用与程序选项 4、拉到最下方,选择程序与功能...
目前一直直接往Windows 2008 R2 Server中复制文件(暂时还没有搭建ftp服务),突然不能复制了,于是百度...
windows下使用vscode配合xebug调试php脚本 要下载有php_xebug.dll扩展的版本,最新版可能没有这个扩展,p...
在控制面板的程序与功能里启用和关闭windows功能打开,适用于linux的windows子系统
效果演示 推荐一个非常牛的文档网站生成器:docsify 我通过这个工具,成功将码云上的个人学习笔记发布到...