[英]Move object in ViewportControl WP8
我正在使用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>
它是在我添加橢圓的地圖中。 我操縱橢圓的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;
}
}
其中Temp.x和Temp.y是橢圓的新位置。
我認為您可以嘗試使用XNA中的TouchPanel和Touch.FrameReported
事件來實現此目的。 可能Map和VieportControl處理操作事件,因此它不會觸發您的代碼。
在我的提議中, Touch_FrameReported
將在每次觸摸屏幕時被觸發,因此我們只需要檢查我們需要的情況 - 這里是IsGestureAvailable
和TouchAction
。 簡單的代碼可能如下所示:
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;
}
}
}
您還可以檢查其他GestureTypes,例如檢查TouchAction.Down
和用戶是否單擊了您的Ellipse。
這些方法為您提供了閱讀TouchPoints
及其Actions
許多可能性,因此它可能會有所幫助。
我花了一段時間才找到了如何禁用Vieport的方法。 我已經找到了一點“黑客”,如果你的VieportControl只是水平或垂直(有鎖屬性,但兩者都不起作用)會更容易。 這是一個小的'hack',它應該禁用水平和垂直滾動:
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;
}
當我想禁用滾動時 - 我將VieportControl的邊界設置為當前視圖(我記得原始視圖)。 當我想啟用滾動時 - 我帶回原始邊界。
正如我測試它 - 它正在工作 - 當然它需要更多的邏輯來鎖定if語句,以便它不會每次觸摸屏幕時鎖定。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.