2

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

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

我怎样才能允许这两种操作?

4

2 回答 2

2

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

我有一个可能对您有用的新想法是在您的 DirectX 控件前面放置另一个 ScrollViewer 并使用它的 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停止处理平移和缩放操作,您就可以调用被操作元素。

于 2013-01-04T17:10:32.503 回答
2

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

ManipulationMode="TranslateX,System"
于 2014-10-20T11:24:19.430 回答