0

我是 C# 和编程的新手,所以这看起来很简单,但我一直在努力寻求帮助。

我正在尝试在 Visual Studio 2012 中的对象(特别是椭圆)上实现 WASD 控件我了解如何操作该对象 - 我的问题是收集用户输入。

似乎在过去,人们使用了System.Windows.Forms,但我不确定它是否存在(它说缺少令牌,当我去添加引用时,它说所有都添加了)。

我尝试在网格中添加一个按键事件,但它永远不会触发。我无法将焦点设置为网格,因为那是在System.Windows.Forms.

所以我的问题是:关于如何实施 WASD 控制的任何提示?或者更多,具体来说,当用户按下一个键而不手动将焦点添加到一个对象时,我该如何注册?

4

1 回答 1

2

既然你说的是 VS2012,C#,但ElipseSystem.Windows.Forms会冒险猜测你真的做了 File -> New Project -> WPF Application (因为它有一个 Ellipse control (primitive) off the bat)。

由于Elipse无法获得焦点,您需要决定何时按下按键是有趣的,为此添加一个处理程序到窗口。这是一些示例 XAML:

  <Window x:Class="WpfApplication1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525" KeyDown="Window_KeyDown">
    <Grid>
      <Ellipse x:Name="elipsy" Fill="#FFF4F4F5" HorizontalAlignment="Left" Height="100" Stroke="Black" VerticalAlignment="Top" Width="100" Canvas.Left="241" Canvas.Top="119"/>
    </Grid>
  </Window>

在您的处理程序 ( Window_KeyDown) 中,您可以执行以下操作:

    private void Window_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.Key == Key.W)
        {
            Canvas.SetTop(elipsy, Canvas.GetTop(elipsy) - 1);
        }
        else if (e.Key == Key.A)
        {
            Canvas.SetLeft(elipsy, Canvas.GetLeft(elipsy) - 1);
        }
        else if (e.Key == Key.S)
        {
            Canvas.SetTop(elipsy, Canvas.GetTop(elipsy) + 1);
        }
        else if (e.Key == Key.D)
        {
            Canvas.SetLeft(elipsy, Canvas.GetLeft(elipsy) + 1);
        }
    }

这应该让你开始走上正轨。如果您真的希望 WinForms 大喊大叫,我们应该能够在那里找到类似的解决方案。

于 2013-06-04T03:51:35.433 回答