0

Canvas を含む ScrollViewer があります。この Canvas にはいくつかの可動 UIElements があります。ここに私のXAMLコードがあります:

<ScrollViewer x:Name="Scroller" HorizontalScrollBarVisibility="Auto" Background="White">
       <Canvas x:Name="MapCanvas" Width="4000" Height="4000">    
                    <Button x:Name="TestBtn" 
                            Content="My button"
                            Canvas.Left="250"
                            ManipulationStarted="MapItem_ManipulationStarted"   
                            ManipulationDelta="MapItem_ManipulationDelta" 
                            ManipulationCompleted="MapItem_ManipulationCompleted"   
                            />                                  
      </Canvas>
</ScrollViewer>

イベント ハンドラのコードは次のとおりです。

private void MapItem_ManipulationDelta(object sender, System.Windows.Input.ManipulationDeltaEventArgs e)
        {
            FrameworkElement btn = sender as FrameworkElement;
            if (null == btn) return;            

            double left = Canvas.GetLeft(btn) + e.DeltaManipulation.Translation.X;
            double top = Canvas.GetTop(btn) + e.DeltaManipulation.Translation.Y;

            if (left < 0)
                left = 0;
            else if (left >  MapCanvas.ActualWidth - btn.ActualWidth)
                left = MapCanvas.ActualWidth - btn.ActualWidth;

            if (top < 0)
                top = 0;
            else if(top > MapCanvas.ActualHeight - btn.ActualHeight)
                top = MapCanvas.ActualHeight - btn.ActualHeight;

            Canvas.SetLeft(btn, left);
            Canvas.SetTop(btn, top);

            e.Handled = true;
        }

        private void MapItem_ManipulationCompleted(object sender, System.Windows.Input.ManipulationCompletedEventArgs e)
        {
            Scroller.HorizontalScrollBarVisibility = ScrollBarVisibility.Auto;
            Scroller.VerticalScrollBarVisibility = ScrollBarVisibility.Auto;            

            e.Handled = true;
        }

        private void MapItem_ManipulationStarted(object sender, System.Windows.Input.ManipulationStartedEventArgs e)
        {
            Scroller.HorizontalScrollBarVisibility = ScrollBarVisibility.Disabled;
            Scroller.VerticalScrollBarVisibility = ScrollBarVisibility.Disabled;

            e.Handled = true;
        }

すべてが完璧に機能します。ただし、ScrollViewer が Horizo​​ntalOffset または VerticalOffset までスクロールし、表示領域内の UIElement をクリックまたはタップすると、ScrollViewer が自動的に HorisontalOffset == 0 および VerticalOffset == 0 にスクロールするように見えます。その後、UIElement を解放した後、ジャンプして戻ります。この動作を回避し、UIElement をその中の Canvas にドラッグしている間、ScrollViewer をその場所に留まらせるにはどうすればよいですか?

4

2 に答える 2

0

ページ コンストラクターで ScrollViewer.ManipulationMode = ManipulationMode.Control を設定する必要があり、HorisontalScrollBarVisibility と VerticalScrollVarVisibility を設定しない (オフセットを 0,0 座標にリセットする) 必要があることがわかりました。

ありがとう!

于 2013-08-28T01:24:20.500 に答える