- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在使用 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
将在您每次触摸屏幕时触发,因此我们只需要检查我们需要的情况 - 这里有 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;
}
}
}
您可以阅读有关手势的更多信息 here at MSDN和 on 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/
嘿,我正在使用 MVVM 玩一个适用于 Windows Phone 8 的应用程序。 我在获取缩放中心和完全理解视口(viewport) Controller 上的边界时遇到问题。最后重新配置 vie
我正在使用 ViewportControl 来滚动和放大和缩小我的 map 。在这张 map 中,我有一个绿色椭圆,我想四处移动。以前我使用 ScrollViewer,我将 ScrollViewer
我是一名优秀的程序员,十分优秀!