如何允许在ListView / GridView项控件中进行操作,同时允许在ListView / GridView上进行滚动和交叉滑动操作?

具体来说,我有一个自定义用户控件,它接收操作事件以滚动自定义DirectX控件。 此控件和其他类似控件是GridView中的项目。 我希望GridView能够水平滚动默认的TranslateRailsX操作,而控件应该能够接收TranslateRailsY操作事件。

在我到目前为止的实验中,通过将控件的操作模式设置为System,我可以使GridView滚动工作,但控件不会接收任何操作事件。 通过将控件的操作模式设置为All,TranslateY或TranslateRailsY,我可以获取自定义控件来接收操作事件,但GridView触摸滚动将无法工作。

我怎么能同时允许这些操作呢?

它不能用8.0完成(8.1滚动到EDIT)。 您需要实现自己的ScrollViewer以在GridView模板中使用,或者在GridView顶部放置一个图层,并按照我之前的建议中继所有输入调用。 实际上,也许实现你自己版本的ScrollViewer并不会那么难(Canvas控件有一个孩子在操作事件的子项上调用Canvas.SetLeft)。

我可能对您有用的一个新想法是将另一个ScrollViewer放在DirectX控件前面并使用其ViewChanged事件,就像使用操作事件一样 – 检查:

XAML

                   

代码背后

 using Windows.UI.Xaml.Controls; namespace App84 { public sealed partial class MainPage : Page { public MainPage() { this.InitializeComponent(); } private void ScrollViewer_OnViewChanged(object sender, ScrollViewerViewChangedEventArgs e) { OffsetTextBlock.Text = ManipulationCaptureScrollViewer.VerticalOffset.ToString(); } } } 

编辑*

另外,对于Windows 8.1,你会得到ManipulationModes.System ,它结合其他模式(虽然不支持缩放和旋转)应该允许你处理ScrollViewer内部的操作。 然后,一旦您希望其父ScrollViewers停止处理平移和缩放操作,您就可以在被操纵的元素上调用CancelDirectManipulations()

您可以在xaml中为ManipulationMode设置两个值。 它有望处理它。

 ManipulationMode="TranslateX,System"