所以简而言之,我只是想在WPF应用程序中围绕Canvas对象移动一个矩形。我这里有我的KeyDown事件功能。问题是,当我长按一个键时,它会反复快速启动这个功能并拧紧我的矩形位置代码。
我背后的理论/逻辑: 因为当你按住键盘上的按钮时它没有平稳地移动(在浏览器的滚动条上测试,它开始,暂停,然后继续下去),我希望它启动一个窗体计时器来移动对象UI。然后当KeyUp事件发生时,计时器STOPS。
public void Window_KeyDown(object sender, KeyEventArgs e)
{
string msg;
string keystr = e.Key.ToString();
Key keyval = e.Key;
switch (keystr)
{
case "Down":
Console.WriteLine("Case 1");
Display.Content = "Down";
foreach (Character character in creatures)
{
//character.buttondown = true;
character.Position("Down");
}
break;
case "Up":
Console.WriteLine("Case 2");
Display.Content = "Up";
foreach (Character character in creatures)
{
//character.buttondown = true;
character.Position("Up");
}
break;
case "Left":
Console.WriteLine("Case 3");
Display.Content = "Left";
foreach (Character character in creatures)
{
//character.buttondown = true;
character.Position("Left");
}
break;
case "Right":
Display.Content = "Right";
foreach (Character character in creatures)
{
//character.buttondown = true;
character.Position("Right");
}
break;
}
}
public void Window_KeyUp(object sender, KeyEventArgs e)
{
Display.Content = "No key is pressed.";
foreach (Character character in creatures)
{
if (e.Key == Key.Right)
{
character.StopIt();
}
if (e.Key == Key.Left)
{
character.StopIt();
}
if (e.Key == Key.Up)
{
character.StopIt();
}
if (e.Key == Key.Down)
{
character.StopIt();
}
}
}
仅供参考,如果您需要我的矩形类代码,我将发布如果按下右箭头键会发生什么:
名称为
public void Position(String Direction)
{
if (Direction == "Right")
{
tmr = new System.Windows.Forms.Timer();
tmr.Interval = this.waitTime;
tmr.Tick += new EventHandler(GoRight);
tmr.Start();
}
}
调用GoRight:
public void GoRight(object sender, System.EventArgs e)
{
if (x < Background.ActualWidth - CharacterWidth)
{
if (goRight)
{
x += incrementSize;
CharacterImage.SetValue(Canvas.LeftProperty, x);
}
if (x > Background.ActualWidth - CharacterWidth)
{
goRight = false;
tmr.Stop();
}
}
}
最后,在KeyUp事件中调用StopIt:
public void StopIt()
{
tmr.Stop();
goRight = true;
goLeft = true;
goUp = true;
goDown = true;
}
我现在只学习了几个月的c#所以我想尽可能保持相对简单,只使用.net。
任何帮助都将不胜感激!!
编辑:: 我的解决方案:
我只是在我的开关盒周围做了一个while(flag)循环。然后我在案例中设置了flag = false。按下Key UP时,我再次将flag设置为true。 YAY
答案 0 :(得分:0)
我不太了解WPF告诉你发生了什么,尽管你可能对按钮/暂停的事情是正确的。这取决于WPF如何处理按键。我的猜测是,它与大多数Microsoft形式的工作方式相同;它有一个停顿,可以防止你一次输入多个字符。可能有办法解决这个问题,但我不确定。
我要说的是你应该使用专为游戏设计的东西。当我第一次尝试创建游戏时,我这样做的风格与你正在做的类似,但它不起作用。您使用的是专为办公软件设计的,无法访问您所需的内容;至少不是没有战斗和变通办法。正如Alex Beisley对XNA所建议的那样。不幸的是,这是一种死语,但它最近才消失。它使用的是c#,由微软制造,并且功能强大,可以在不打击你的情况下做你想做的事情,并且一旦掌握了它就很容易使用。看到它被杀掉是一种耻辱。
如果你想折磨自己,那么我建议走我一直在尝试的路线,学习C ++和DirectX。这并不容易,你需要耐心等待并经历多个教程(没有一个教程似乎可以很好地解释任何事情)。 DirectX和C ++不会很快出现,所以如果你想要用一种长期的语言,它们是一个安全的选择。
答案 1 :(得分:0)
我假设您希望角色在初始KeyDown事件上移动。然后,在获得KeyUp事件之前,您希望忽略任何后续的KeyDown事件。
因此,您可以通过检查e.IsRepeat例如
来忽略后续的KeyDown事件public void Window_KeyDown(object sender, KeyEventArgs e)
{
if (e.IsRepeat) return;
// rest of your code...
顺便说一句,滚动应用程序时观察到的非平滑移动是由键盘重复延迟引起的。您可以在键盘属性中设置此项,或者通过http://msdn.microsoft.com/en-us/library/system.windows.systemparameters.keyboarddelay.aspx
进行设置