tmytのらくがき

個人の日記レベルです

ListPickerをScrollViewer上に置くと動かない の続き

1個前のエントリでListPickerをScrollViewerに置くと動かないので、自分で直しましょう。というのを書いたけども、あのコードだとScrollViewerをスクロールするときに、指がListPicker上にあるとListPickerが開いてしまってとてもよろしくない。
なので、この問題のなおしかた。

Point point = new Point(e.ManipulationOrigin.X, e.ManipulationOrigin.Y);
if (e.ManipulationContainer != e.OriginalSource)
{
   var trans = e.ManipulationContainer.TransformToVisual((UIElement)e.OriginalSource);
   point = trans.Transform(point);
}
 
if (IsValidManipulation(e.OriginalSource, point.X, point.Y) && 0 < Items.Count)
{
   if (Open())
   {
      e.Handled = true;
   }
}

こう直したところの先頭に

if (e.FinalVelocities == null) return;

これを追加。
するとこんな感じに。

if (e.FinalVelocities == null) return;
Point point = new Point(e.ManipulationOrigin.X, e.ManipulationOrigin.Y);
if (e.ManipulationContainer != e.OriginalSource)
{
   var trans = e.ManipulationContainer.TransformToVisual((UIElement)e.OriginalSource);
   point = trans.Transform(point);
}
 
if (IsValidManipulation(e.OriginalSource, point.X, point.Y) && 0 < Items.Count)
{
   if (Open())
   {
      e.Handled = true;
   }
}

ドラッグしたときは指が離れたときにManipulationCompletedイベントが発生してFinalVelocityに指が離れた時点での移動速度の値が入っているのだけど、ScrollViewerのスクロールが実行された場合はMouseUpが発生しないままManipulationCompletedが発生するのでその場合はFinalVelocityがnullになるみたい。
なのでそこをチェックしてドラッグしたときは開かないようにしてみました。