2

具体的には、カスタム DirectX コントロールをスクロールするための操作イベントを受け取るカスタム ユーザー コントロールがあります。このコントロールおよびその他の同様のコントロールは、GridView 内の項目です。GridView をデフォルトの TranslateRailsX 操作で水平方向にスクロールできるようにしたいのですが、コントロールは TranslateRailsY 操作イベントを受け取ることができる必要があります。

これまでの実験では、コントロールの操作モードをシステムに設定することで、GridView のスクロールを機能させることができましたが、コントロールは操作イベントを受け取りません。コントロールの操作モードを All、TranslateY、または TranslateRailsY に設定すると、カスタム コントロールで操作イベントを受け取ることができますが、GridView のタッチ スクロールは機能しません。

これらの操作の両方を許可するにはどうすればよいですか?

4

2 に答える 2

2

8.0 では実行できません (8.1 の場合は EDIT までスクロールします)。独自の ScrollViewer を実装して GridView テンプレートで使用するか、GridView の上にレイヤーを配置して、前に提案したようにすべての入力呼び出しを中継する必要があります。実際には、ScrollViewer の独自のバージョンを実装することは、おそらくそれほど難しくありません (操作イベントの子項目で Canvas.SetLeft を呼び出す 1 つの子を持つ Canvas コントロール)。

私が持っている新しいアイデアの 1 つは、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 に 2 つの値を設定できます。うまくいけばそれを処理します。

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