在ViewportControl WP8中移动对象

Jon*_*N89 6 c# wpf drag-and-drop viewport windows-phone-8

我正在使用ViewportControl滚动并放大和缩小我的地图.在这张地图中,我有一个绿色的椭圆形,我希望它能够移动.以前我使用ScrollViewer设置ScrollViewer的manipulationMode来控制,从而使它能够移动我的椭圆.但是我找不到类似于ViewportControl的方法.那么有一种方法可以移动我的椭圆吗?

我到目前为止的代码是:

我在我的地图周围有我的ViewportControl的xaml部分

   <ViewportControl x:Name="ViewPortTestTest" Bounds="0,0,1271,1381.5" Height="480" Width="800" Canvas.ZIndex="1" Grid.Row="1">
        <ViewportControl.RenderTransform>
            <CompositeTransform x:Name="myTransformTest"/>
        </ViewportControl.RenderTransform>

        <View:Map x:Name="ZoomableContent" >
            <View:Map.RenderTransform>
                <CompositeTransform x:Name="myTransform" />
                <!-- ScaleX="{Binding Map.imageScale}" ScaleY="{Binding Map.imageScale}"/>-->
            </View:Map.RenderTransform>
        </View:Map>
    </ViewportControl>
Run Code Online (Sandbox Code Playgroud)

它是在我添加椭圆的地图中.我操纵椭圆的viewModel

public void ManStart(ManipulationStartedEventArgs e)
    {

        e.Handled = true;

        ViewportControl VP = FindParentOfType<ViewportControl>(ChampViewModelSel);


       }
    }

    public void ManDelta(ManipulationDeltaEventArgs e)
    {
        e.Handled = true;


        Point fingerPosition = e.DeltaManipulation.Translation;

        Temp.x = fingerPosition.X;
        Temp.y = fingerPosition.Y;

        }
    }
Run Code Online (Sandbox Code Playgroud)

其中Temp.x和Temp.y是椭圆的新位置.

Rom*_*asz 3

我认为您可以尝试使用XNA 的TouchPanelTouch.FrameReported和事件来实现此目的。可能 Map 和 VieportControl 会处理操作事件,因此它不会随您的代码一起触发。

在我的建议中,Touch_FrameReported每次触摸屏幕时都会被触发,因此我们必须仅检查我们需要的情况 - 这里出现了IsGestureAvailableTouchAction。简单的代码可以如下所示:

public MainPage()
{
    InitializeComponent();
    TouchPanel.EnabledGestures = GestureType.FreeDrag;
    Touch.FrameReported += Touch_FrameReported;
}

private void Touch_FrameReported(object sender, TouchFrameEventArgs e)
{
    if (TouchPanel.IsGestureAvailable) // check only dragging 
    {
       // get point relative to Viewport
       TouchPoint mainTouch = e.GetPrimaryTouchPoint(ViewPortTestTest);
       // check if drag has completed (key up)
       if (mainTouch.Action == TouchAction.Up)
       {
          Temp.x = mainTouch.Position.X;
          Temp.y = mainTouch.Position.Y;
       }
    }
}
Run Code Online (Sandbox Code Playgroud)

您可以在 MSDN此博客上阅读有关手势的更多信息。

您还可以检查其他手势类型,例如检查TouchAction.Down用户是否单击了您的椭圆形。

这些方法为您提供了许多阅读的可能性TouchPointsActions因此也许会有所帮助。


我花了一段时间才找到禁用 Vieport 的方法。我为此找到了一些“技巧”,如果您的 VieportControl 仅是水平或垂直的(有一个锁定属性,但不适用于两者),则会更容易。这是这个小“黑客”,它应该禁用水平和垂直滚动:

Rect originalBounds = new Rect();
private void Touch_FrameReported(object sender, TouchFrameEventArgs e)
{
    TouchPoint myTouchPoint = e.GetPrimaryTouchPoint(ViewPortTestTest);
   // disable scrolling
   if (myTouchPoint.Action == TouchAction.Down) // here probably some other statement like if user hit ellipse
   {
       originalBounds = ViewPortTestTest.Bounds;
       ViewPortTestTest.Bounds = ViewPortTestTest.Viewport; // set current view as Bounds
   }

    // more logic

   // enable once again
   if (myTouchPoint.Action == TouchAction.Up)
        ViewPortTestTest.Bounds = originalBounds;
}
Run Code Online (Sandbox Code Playgroud)

当我想禁用滚动时 - 我将 VieportControl 的边界设置为当前视图(我记得原始视图)。当我想启用滚动时 - 我恢复原始边界。

正如我测试过的那样 - 它正在工作 - 当然它需要更多的逻辑来锁定 if 语句,这样它就不会在每次触摸屏幕时锁定。

  • 不确定我是否理解正确,但是当我拖动手指时,ViewportControl 不会在我拖动手指时仍然滚动吗?或者是哪一部分确保 ViewportControl 不会滚动? (2认同)