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

本文关键字:GridView ListView 滚动 操作 控件 项目 何允许 | 更新日期: 2023-09-27 17:50:34

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

在我的实验到目前为止,通过设置控件的操作模式为系统,我可以得到GridView滚动工作,但控件将不会收到任何操作事件。通过将控件的操作模式设置为All,或TranslateY,或TranslateRailsY,我可以让我的自定义控件接收操作事件,但GridView触摸滚动将不起作用。

我怎么能允许这两个操作?

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

这不能在8.0中完成(对于8.1滚动到编辑)。你需要实现你自己的ScrollViewer在GridView模板中使用,或者像我之前建议的那样,在GridView的顶部放置一层并中继所有输入调用。实际上,也许实现你自己版本的ScrollViewer并不难(一个Canvas控件,有一个子控件调用Canvas)。

我有一个可能对你有用的新想法是把另一个ScrollViewer放在你的DirectX控件前面,并使用它的ViewChanged事件,就像你使用操纵事件一样-检查这个:

XAML

<Page
    x:Class="App84.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:App84"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d">
    <Grid
        Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
        <GridView>
            <Grid
                Width="300"
                Height="300">
                <Rectangle
                    x:Name="DirectXControlPlaceholder"
                    Width="300"
                    Height="300"
                    Fill="Yellow" />
                <ScrollViewer
                    x:Name="ManipulationCaptureScrollViewer"
                    Style="{StaticResource VerticalScrollViewerStyle}"
                    VerticalScrollBarVisibility="Hidden"
                    ViewChanged="ScrollViewer_OnViewChanged">
                    <Rectangle
                        Width="200"
                        Height="10000"
                        Fill="Transparent"/>
                </ScrollViewer>
                <TextBlock
                    x:Name="OffsetTextBlock"
                    Foreground="Black"
                    FontSize="24"
                    VerticalAlignment="Center"
                    HorizontalAlignment="Center"
                    />
            </Grid>
            <Rectangle
                Width="300"
                Height="300"
                Fill="GreenYellow" />
            <Rectangle
                Width="300"
                Height="300"
                Fill="LimeGreen" />
            <Rectangle
                Width="300"
                Height="300"
                Fill="Red" />
            <Rectangle
                Width="300"
                Height="300"
                Fill="OrangeRed" />
            <Rectangle
                Width="300"
                Height="300"
                Fill="DarkOrange" />
            <Rectangle
                Width="300"
                Height="300"
                Fill="Orange" />
        </GridView>
    </Grid>
</Page>

代码后面

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内部的操作。然后你可以在被操纵的元素上调用CancelDirectManipulations(),一旦你想让它的父元素ScrollViewers停止处理缩放操作。

在xaml中可以为ManipulationMode设置两个值。希望它能处理好。

ManipulationMode="TranslateX,System"