C# 奇数物体运动

C# 奇数物体运动,c#,wpf,C#,Wpf,我有一个令人愉快的矩形,名为ship,我用左右箭头键控制它。当我第一次按下一个键时,船会朝相反的方向移动,第一次移动时它应该朝相反的方向移动,然后返回正确的方向。对于这个特殊的难题,什么是优雅的解决方案 public double p = 0; private void Window_KeyDown_1(object sender, KeyEventArgs e) { if (e.Key == Key.Right) { s

我有一个令人愉快的矩形,名为ship,我用左右箭头键控制它。当我第一次按下一个键时,船会朝相反的方向移动,第一次移动时它应该朝相反的方向移动,然后返回正确的方向。对于这个特殊的难题,什么是优雅的解决方案

public double p = 0;

    private void Window_KeyDown_1(object sender, KeyEventArgs e)
    {
        if (e.Key == Key.Right)
        {
            ship.Margin = new Thickness(p, 259, 0, 12);
            p = p + 10;
        }

        if (e.Key == Key.Left)
        {
            ship.Margin = new Thickness(p, 259, 0, 12);
            p = p - 10;
        }

设置边距后,您正在更改
p
的值。这意味着你实际上总是落后一键。我希望您在进行更改之前先进行设置。(请注意,我不确定设置边距是否真的是移动某些内容的理想方式…

请考虑删除当前左侧边距的字段。您可以在更改前获得当前的发货保证金。也可拆分处理用户输入和船舶移动操作:

// Handle user input
private void Window_KeyDown_1(object sender, KeyEventArgs e)
{
    switch(e.Key)
    {
        case (Key.Right): 
              MoveShip(Direction.Right); return;
        case (Key.Left): 
              MoveShip(Direction.Left); return;
        default:
            return;
    }
}        

// Here you implement ship movement (Margin, Canvas.SetLeft, etc)
private void MoveShip(Direction direction)
{
    var margin = ship.Margin; // or create copy here
    const int distance = 10;

    switch(direction)
    {
       case(Direction.Left):
            margin.Left -= distance;
            break;
       case(Direction.Right):
            margin.Left += distance;
            break;
       default:
            return;
    }

    ship.Margin = margin;
}

private enum Direction
{
    Left,
    Right
}

的确我不确定它是否“标准”,但更一般地说是
Canvas.SetLeft
等。请参阅更多用法。我想他是从Visual Studio中的WPF设计师那里得到这个想法的。它也能做到这一点。好吧,你们中有谁能推荐一种更好的方法吗?没关系,通过玩其他东西,我找到了一种很好的方法,我可以应用于此。