2014-03-28 13 views
6

Ich verwende das ViewportControl zum Scrollen und Vergrößern und Verkleinern meiner Map. In dieser Karte habe ich eine grüne Ellipse, um die ich mich bewegen möchte. Zuvor habe ich einen ScrollViewer verwendet, bei dem ich den manipulationsMode des ScrollViewers zur Steuerung anwendete und damit meine Ellipse bewegen konnte. Ich kann jedoch eine ähnliche Methode für das ViewportControl nicht finden. Gibt es eine Möglichkeit, meine Ellipse zu bewegen?Objekt in ViewportControl WP8 verschieben

Der Code, den ich so weit habe:

XAML Teil, wo ich meinen ViewportControl um meine Karte

<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> 

Es ist in der Karte, wo ich die Ellipse hinzufügen. Das Ansichtsmodell, wo ich meine Ellipse manipulieren

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; 

     } 
    } 

Wo Temp.x und Temp.y die neue Position der Ellipse ist.

Antwort

3

Ich denke, Sie könnten versuchen, TouchPanel von XNA und Touch.FrameReported Ereignis für diesen Zweck zu verwenden. Wahrscheinlich behandeln Map und VieportControl das Manipulationsereignis, sodass es nicht mit Ihrem Code ausgelöst wird.

In meinem Vorschlag Touch_FrameReported wird jedes Mal gefeuert, wenn Sie den Bildschirm berühren, so müssen wir nur für Situationen, die wir brauchen zu überprüfen - hier kommt IsGestureAvailable und TouchAction. Einfacher Code kann wie folgt aussehen:

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; 
     } 
    } 
} 

Sie können mehr über Gestures lesen here at MSDN und on this blog.

Sie können auch andere GestureTypes überprüfen und zum Beispiel prüfen, ob TouchAction.Down und Benutzer auf Ihre Ellipse geklickt haben.

Diese Methoden geben Ihnen viele Möglichkeiten zu lesen TouchPoints und ihre Actions so vielleicht wird es helfen.


Ich brauchte eine Weile, um einen Weg zu finden, Vieport zu deaktivieren. Ich habe einen kleinen "Hack" dafür gefunden, es wird einfacher sein, wenn Ihr VietportControl nur horizontal oder vertikal ist (es gibt eine Lock-Eigenschaft, aber funktioniert nicht für beide). Hier ist dieser kleine ‚hacken‘, die sowohl horizontale und vertikale Scrollen deaktivieren sollte:

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; 
} 

Wenn ich Scrollen deaktivieren wollen - ich Grenzen des VieportControl auf die aktuelle Ansicht einstellen (und ich erinnere mich Originale). Wenn ich das Scrollen aktivieren möchte, stelle ich die ursprünglichen Grenzen wieder her.

Wie ich es getestet habe - es funktioniert - natürlich braucht es ein wenig mehr Logik beim Sperren von if-Anweisung, so dass es nicht jedes Mal sperren wird, wenn Sie den Bildschirm berühren.

+2

Nicht sicher, ob ich das Recht verstehe, aber wenn ich meinen Finger ziehe, scrollt das ViewportControl nicht, während ich meinen Finger schleppe? oder welcher Teil stellt sicher, dass das ViewportControl nicht scrollt? – JonasN89

+0

@ JonasN89 Sie haben Recht, dass die erste Version das Scrollen nicht verhindern wird. Es hat einige Zeit gedauert, bis ich einen Weg gefunden habe, wie man einen "gesperrten" Viewport erreichen kann - es ist nicht so einfach wie es scheint. Ich habe einen kleinen "Hack" ausprobiert, den Sie in meiner bearbeiteten Antwort sehen können. – Romasz

+0

Ich habe versucht, Ihre Idee zu implementieren, aber anscheinend schneidet sie den Bildschirm nicht richtig ab. Ich habe versucht, die Grenzen zu betrachten, und es scheint nicht, als ob es die Spitze oder die Linke benutzt, irgendeine Hilfe? – JonasN89