【问题标题】:WPF KeyDown method can't be found in class despite being defined尽管已定义 WPF KeyDown 方法,但在类中找不到
【发布时间】:2018-10-07 20:12:12
【问题描述】:

我希望在按下回车键时调用 KeyPress 方法,所以我将整个窗口的 KeyDown 事件写入了窗口定义中(如下所示):

<Window x:Name="window" x:Class="MoonLander.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:MoonLander"
    xmlns:oxy="http://oxyplot.org/wpf"
    mc:Ignorable="d"
    Loaded="OnLoaded"
    KeyDown="KeyPress"
    Title="Moon Lander 2018" Height="580.714" Width="958.824" AutomationProperties.AcceleratorKey="" Background="White">

我在我的 MainWindow class 中定义了 KeyPress 函数,如下所示:

public void KeyPress(object sender, KeyEventArgs e)
{
   //Do something
}

任何想法为什么我会收到此错误消息? :

错误 CS1061 'MainWindow' 不包含 'KeyPress' 的定义,并且>>找不到接受第一个参数类型 >>'MainWindow' 的可访问扩展方法 'KeyPress'(您是否缺少 using 指令或>>汇编参考?)

我需要将焦点设置在窗口上吗? (我尝试使用 Loaded="OnLoaded" 执行此操作,但出现相同的错误消息)

我尝试更改保护级别并将第一个参数更改为 MainWindow 对象,但我得到了同样的错误。

【问题讨论】:

  • 是你全部输入的,还是 Visual Studio 生成的事件?

标签: c# wpf keyevent keyeventargs


【解决方案1】:

我的猜测是您手动编写了代码,而不是使用 IDE 来生成处理程序。这意味着中间代码不包含事件和您的方法的绑定。在您的情况下,该绑定出现在通常命名为这样的隐藏文件中:

MainWindow.g.i.cs

您应该做的是在 XAML 中,首先键入您希望处理的事件,在本例中为 KeyDown,然后让 IDE 通过使用 TAB 键自动生成处理程序来完成其工作。你最终应该得到这样的方法:

private void MainWindow_KeyDown(Object sender, KeyEventArgs e)
{
}

请注意,自动生成的方法是 private,而您的方法是 public。这是你手工完成的第一个线索。

【讨论】:

    【解决方案2】:

    我写了同样的代码,没有错误。你应该在 xaml 更改函数名再试一次。然后按下 f12 键以自动创建函数。

    【讨论】:

      【解决方案3】:

      我尝试从您的代码中复制问题。 但它没有任何问题。 请找到我使用的以下代码,

         public void KeyPress(object sender, KeyEventArgs e)
              {
                  try
                  {
                      if (e.Key == Key.Enter)
                      {
                          MessageBox.Show("Enter Key Pressed!");
                      }
      
                  }
                  catch (Exception ex)
                  {
                      MessageBox.Show(ex.Message);
                  }
              }
      

      【讨论】:

      • 投反对票的人能解释一下原因吗?对我有帮助
      • 可能是因为你无法知道你正在做的事情是否真的复制了 OP 做过/没做过的事情。
      • 我在一个新文件中重试了相同的功能,它似乎可以工作,但仍然为问题所困扰
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-29
      • 1970-01-01
      • 2019-07-18
      相关资源
      最近更新 更多