8

UWP から変換する WPF アプリ用の次の XAML があります。

<ScrollViewer Name="scv_main" Grid.Row="2" ScrollViewer.VerticalScrollBarVisibility="Auto" 
PanningMode="VerticalFirst">
    <TextBlock Name="txbl_display" Grid.Row="2"  Foreground="White"
     FontFamily="Lucida Console" FontSize="22" Text="{Binding Path=ContentPath, Mode=OneWay, 
     UpdateSourceTrigger=PropertyChanged}" Padding="20" TextWrapping="Wrap" 
     IsManipulationEnabled="True" ManipulationDelta="manipulationDeltaHandler"/>
</ScrollViewer>

私が見つけたのは、イベントハンドラーe.IsInertialは常にfalseです。

ScrollViewer が慣性イベントを処理している可能性があると思いましたが、ScrollViewer を削除しても、慣性イベントを取得できません。また、ManipulationDelta を ScrollViewer に配置しようとしましたが、同じ結果になりました。

私の最終的な目標は、ScrollViewer が非慣性移動でスクロールすることですが、慣性スワイプで何が起こるかを制御できるようにすることです。

次のように、WPFに移植しているUWPアプリでこの効果を管理しました。

<TextBlock ... ManipulationMode="All" ManipulationDelta="TextBlock_ManipulationDelta/>"

そしてコードビハインドで:

if (e.IsInertial) // inertial = swipe, rather than slide
{
    // X-Translation - change contents of textblock
    if (e.Cumulative.Translation.X <= -500) //500 is the threshold value, where you want to trigger the swipe right event
    {
        showNext();
        e.Complete();
    }
    else if (e.Cumulative.Translation.X >= 500)
    {
        showPrevious();
        e.Complete();
    }

    // Y translation - move the scrollbar
    else if (e.Cumulative.Translation.Y <= -500)
    {
        scv_main.ChangeView(null, scv_main.VerticalOffset + (-1 * e.Cumulative.Translation.Y), null);
        e.Complete();
    }
    else if (e.Cumulative.Translation.Y >= 500)
    {
        scv_main.ChangeView(null, Math.Min(scv_main.VerticalOffset + (-1 * e.Cumulative.Translation.Y), 0), null);
        e.Complete();
    }
}
else // slide,rather than swipe - scroll as the finger moves
{
    if (e.Delta.Translation.Y != 0)
    {
        scv_main.ChangeView(null, scv_main.VerticalOffset + (-1 * e.Delta.Translation.Y), null);
    }
}

しかし、WPF でこの動作を繰り返すことはできません。何かご意見は?

- -アップデート - -

画面を全画面表示にして、右上から左下に大きく弧を描くようにスワイプすると、ほぼe.IsInertial = Trueイベントをトリガーできることがわかりました。これが発生すると、ManipulationDeltaイベントは 2 回トリガーされます。1 回目はe.IsInertial = falseで、2回目は でトリガーされe.IsInertial = trueます。なぜこれが起こるのかわかりません。とにかく、これは私が探している動作ではありません。

誰かもっと考えがありますか?すべての上にパネルを配置し、その上に操作ハンドラーを配置するなど、さまざまなことを試しました。しかし、私はまだ同じ問題を抱えていました。

Visual Studio 2017 と Windows 10 を使用しています。コーディングとテストを行っているデバイスは、Microsoft Surface Book です。


起こっているように見えるのは、非慣性運動が最初に起こっているということです。それが完了すると、慣性が発火します。イベントにいくつかの出力を入れ、スワイプすると次のようになりました。

ManipulationStarting Fired
ManipulationDelta e.IsInertial = False. X,Y:-5.14288330078125,-1.14288330078125
ManipulationDelta e.IsInertial = False. X,Y:-16.5714111328125,0
ManipulationDelta e.IsInertial = False. X,Y:-16.5714111328125,0
ManipulationDelta e.IsInertial = False. X,Y:-89.1428833007813,1.14288330078125
ManipulationDelta e.IsInertial = False. X,Y:-224,2.28570556640625
ManipulationDelta e.IsInertial = False. X,Y:-224,2.28570556640625
ManipulationDelta e.IsInertial = False. X,Y:-384.571441650391,4
ManipulationDelta e.IsInertial = False. X,Y:-622.285705566406,4
ManipulationDelta e.IsInertial = False. X,Y:-622.285705566406,4
ManipulationDelta e.IsInertial = False. X,Y:-622.285705566406,4
ManipulationDelta e.IsInertial = False. X,Y:-732.571411132813,6.28570556640625
ManipulationDelta e.IsInertial = False. X,Y:-732.571411132813,6.28570556640625
ManipulationDelta e.IsInertial = False. X,Y:-732.571411132813,6.28570556640625
ManipulationDelta e.IsInertial = False. X,Y:-732.571411132813,6.28570556640625
ManipulationInertiaStarting Fired

その後、デルタが起動しなくなりました。それで、それらを消費しているのは何ですか。なぜ最初に非慣性のものを取得するのですか?

この種の作業を行うために私が見つけた1つの方法は、に変更PanningMode="VerticalFirst"することPanningMode="None"です。次に、スクロールを自分で処理します(これは、UWPバージョンがとにかく行っていたようです)...しかし、「e.IsInertial」チェックを取り除く必要があります。そのため、イベント ハンドラーが取得する前に慣性デルタが消費される原因となっています。

4

1 に答える 1