gpt4 book ai didi

c# - 在 ViewportControl WP8 中移动对象

转载 作者:太空狗 更新时间:2023-10-29 21:50:16 26 4
gpt4 key购买 nike

我正在使用 ViewportControl 来滚动和放大和缩小我的 map 。在这张 map 中,我有一个绿色椭圆,我想四处移动。以前我使用 ScrollViewer,我将 ScrollViewer 的 manipulationMode 设置为控制,从而使其能够移动我的椭圆。但是我找不到 ViewportControl 的类似方法。那么有没有办法移动我的椭圆?

到目前为止我得到的代码是:

xaml 部分,我的 map 周围有我的 ViewportControl

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

它在我添加椭圆的 map 中。我操纵椭圆的 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 是椭圆的新位置。

最佳答案

我想你可以尝试使用 TouchPanel XNA 和 Touch.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;
}
}
}

您可以阅读有关手势的更多信息 here at MSDNon this blog .

您还可以检查其他 GestureType,例如检查 TouchAction.Down 和用户是否点击了您的 Ellipse。

这些方法为您提供了多种阅读TouchPoints 及其Actions 的可能性,因此可能会有所帮助。


我花了一段时间才找到禁用 Vieport 的方法。我为此找到了一些“hack”,如果您的 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 的边界设置为当前 View (我记得原始 View )。当我想启用滚动时 - 我带回原始边界。

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

关于c# - 在 ViewportControl WP8 中移动对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22717113/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com