5

C#/XAML を使用して Windows 8 ストア アプリを作成しました。私のインターフェースにはスクロール可能なリストが含まれており、ScrollViewer. リスト内の要素の操作イベントを処理できるようにしたいのですが、リスト要素ManipulationMode以外Noneに設定すると、リストがスクロールしなくなります。

UI の簡易バージョンを次に示します。

<ScrollViewer>
  <Border/> <!-- these contain child content -->
  <Border/>
  <Border/>
  <!-- Set ManipulationMode on an element in order to receive manipulation events -->
  <!-- This causes the scroll viewer to stop working! -->
  <Border ManipulationMode="All"
          ManipulationDelta="..."/>
  <Border/>
  <Border/>
</ScrollViewer>

WinRTがパフォーマンス上の理由からScrollViewer特殊な を使用してManipulationModeいることは理解していますが、水平方向の操作/ジェスチャに応答する要素を含む、垂直方向にスクロールするリストが必要です。Systemこれを可能にする創造的な回避策を考えられる人はいますか?

4

2 に答える 2

10

長い時間かもしれませんが、良い解決策が見つかりませんでした。私は自分が望んでいたことを非常に簡単に達成しました。

public MovableGrid()
        {
            ManipulationMode = ManipulationModes.TranslateX | ManipulationModes.System;
            AddHandler(ManipulationDeltaEvent, new ManipulationDeltaEventHandler(UIElement_OnManipulationDelta), true);
            AddHandler(ManipulationCompletedEvent, new ManipulationCompletedEventHandler(UIElement_OnManipulationCompleted), true);
        }

MovableGrid を X 軸上に移動させたいと思っていました。scrollviewer でスクロールしたい MovableGrids のリストがあります。それだけで十分です。

于 2015-02-09T17:55:32.767 に答える
8

私がやったことは、ScrollViewerの上に透明な長方形を置き、そこで操作を処理することでした。操作で ScrollViewer をスクロールする必要があることがわかったら、ScrollToHorizo​​ntal/VerticalOffset() メソッドを使用して ScrollViewer をスクロールします。ManipulationStarted では、VisualTreeHelper.FindElementsInHostCoordinates も使用して、操作できるアイテムを確認し、さまざまな条件に応じてそのアイテムを操作するかどうかを決定できます。ただし、かなりのカスタム コードです。また、ユーザーが ScrollViewer のデフォルトの動作を模倣したり、マウスのスクロールホイールを処理したりするために最小/最大オフセットよりも遠くにドラッグしようとした場合は、ScrollViewer の ScrollContentPresenter の RenderTransform を更新する必要があります。

編集*別の同様の質問に答えようとしたときに考えた別の解決策は、別の ScrollViewer を子アイテムとして使用し、操作イベントの代わりにその ViewChanged イベントを使用することでした。

編集 2*

また、Windows 8.1 ではManipulationModes.System、他のモードと組み合わせて、 内で操作を処理できるようにする必要がありますScrollViewer。次に、親がパンとズームの操作の処理を停止するようにしCancelDirectManipulations()たい場合は、操作された要素を呼び出すことができます。ScrollViewers

于 2012-09-28T21:45:31.447 に答える