根据WP8 App中的方向键移动对象
Moving an object according to the direction button in WP8 App
我正在尝试根据方向按钮 向上、向左、向右、向下移动对象。
我正在设置边距 属性,例如:-
img.Margin = new Thickness(l, t, r, b); //L T R B
我是incrementing/decrementing这个值是根据需要的移动需要的。
我可以通过点击事件移动对象。 但是,每当为用户按下并按住按钮时,我想将对象沿所需方向移动。一旦用户释放按钮,移动也应该停止。
我试过使用hold事件,但是操作执行了一次就停止了。
在另一次尝试中,我尝试循环我的语句,但应用程序停止了。
请帮帮我。谢谢!
编辑:-
我处理了 ManipulationStarted、ManipulationDelta、ManipulationCompleted 事件。
现在,只要按住按钮,我就可以移动对象。 然而,我面临的新问题是我必须不断地让手指在屏幕上移动以执行动作。
向上按钮(垂直方向移动对象的按钮)的代码是:-
public double l = 0.0, t = 0.0, r = 0.0, b = 0.0;
public void move()
{
img.Margin = new Thickness(l, t, r, b); //L T R B
}
private void up_ManipulationStarted(object sender, ManipulationStartedEventArgs e)
{
}
private void up_ManipulationDelta(object sender, ManipulationDeltaEventArgs e)
{
t = t + 1.0;
move();
}
private void up_ManipulationCompleted(object sender, ManipulationCompletedEventArgs e)
{
}
我不确定这个方法是否正确。做建议。谢谢
您应该使用 ManipulationStarted
和 ManipulationCompleted
事件。它们适用于 Tap
和 Hold
手势,如下所述:https://msdn.microsoft.com/en-us/library/windows/apps/ff426933(v=vs.105).aspx
更新
要正确检测敲击的开始和结束,我建议使用 MouseEnter
和 MouseLeaving
事件。
这里有一个示例,显示了我如何向下移动一个对象。
这是当前屏幕中央的一个正方形:
<Grid x:Name="objectToMove" Background="red" Height="100" Width="100">
<Grid.RenderTransform>
<TranslateTransform x:Name="verticalTransform" Y="0" />
</Grid.RenderTransform>
</Grid>
背后的代码:
AutoResetEvent autoEvent = new AutoResetEvent(true);
System.Threading.Timer dt;
private void toggle_MouseEnter(object sender, MouseEventArgs e)
{
dt = new System.Threading.Timer(new TimerCallback(MoveFunct), autoEvent, 0, 1);
}
private void MoveFunct(Object stateInfo)
{
Deployment.Current.Dispatcher.BeginInvoke(() => { verticalTransform.Y += 3; });
}
private void toggle_MouseLeave(object sender, MouseEventArgs e)
{
dt.Dispose();
}
请注意,Timer
构造函数的最后一个参数包含刻度之间的间隔。同样在 MoveFunct
函数中,我正在调用 Dispatcher
方法,否则它无法访问 UI 线程。
在示例中,我使用了 TranslateTransform
,在我看来,这比 Margin
操作更好,因为它需要更新元素整个可视化树。
我正在尝试根据方向按钮 向上、向左、向右、向下移动对象。
我正在设置边距 属性,例如:-
img.Margin = new Thickness(l, t, r, b); //L T R B
我是incrementing/decrementing这个值是根据需要的移动需要的。
我可以通过点击事件移动对象。 但是,每当为用户按下并按住按钮时,我想将对象沿所需方向移动。一旦用户释放按钮,移动也应该停止。
我试过使用hold事件,但是操作执行了一次就停止了。
在另一次尝试中,我尝试循环我的语句,但应用程序停止了。
请帮帮我。谢谢!
编辑:-
我处理了 ManipulationStarted、ManipulationDelta、ManipulationCompleted 事件。
现在,只要按住按钮,我就可以移动对象。 然而,我面临的新问题是我必须不断地让手指在屏幕上移动以执行动作。
向上按钮(垂直方向移动对象的按钮)的代码是:-
public double l = 0.0, t = 0.0, r = 0.0, b = 0.0;
public void move()
{
img.Margin = new Thickness(l, t, r, b); //L T R B
}
private void up_ManipulationStarted(object sender, ManipulationStartedEventArgs e)
{
}
private void up_ManipulationDelta(object sender, ManipulationDeltaEventArgs e)
{
t = t + 1.0;
move();
}
private void up_ManipulationCompleted(object sender, ManipulationCompletedEventArgs e)
{
}
我不确定这个方法是否正确。做建议。谢谢
您应该使用 ManipulationStarted
和 ManipulationCompleted
事件。它们适用于 Tap
和 Hold
手势,如下所述:https://msdn.microsoft.com/en-us/library/windows/apps/ff426933(v=vs.105).aspx
更新
要正确检测敲击的开始和结束,我建议使用 MouseEnter
和 MouseLeaving
事件。
这里有一个示例,显示了我如何向下移动一个对象。
这是当前屏幕中央的一个正方形:
<Grid x:Name="objectToMove" Background="red" Height="100" Width="100">
<Grid.RenderTransform>
<TranslateTransform x:Name="verticalTransform" Y="0" />
</Grid.RenderTransform>
</Grid>
背后的代码:
AutoResetEvent autoEvent = new AutoResetEvent(true);
System.Threading.Timer dt;
private void toggle_MouseEnter(object sender, MouseEventArgs e)
{
dt = new System.Threading.Timer(new TimerCallback(MoveFunct), autoEvent, 0, 1);
}
private void MoveFunct(Object stateInfo)
{
Deployment.Current.Dispatcher.BeginInvoke(() => { verticalTransform.Y += 3; });
}
private void toggle_MouseLeave(object sender, MouseEventArgs e)
{
dt.Dispose();
}
请注意,Timer
构造函数的最后一个参数包含刻度之间的间隔。同样在 MoveFunct
函数中,我正在调用 Dispatcher
方法,否则它无法访问 UI 线程。
在示例中,我使用了 TranslateTransform
,在我看来,这比 Margin
操作更好,因为它需要更新元素整个可视化树。