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」チェックを取り除く必要があります。そのため、イベント ハンドラーが取得する前に慣性デルタが消費される原因となっています。