WPF子类捕获按键事件

时间:2016-06-13 09:07:58

标签: c# wpf

我是WPF的新手,正在构建一个测试应用程序。在我的应用程序中,我有一个用户控件,它正在调用另一个类来从设备捕获指纹。从设备捕获指纹的类正在do while循环上运行,该循环不断地从设备读取。我想介绍一个可以打破做的事件。在我的用户控件中,我可以捕获KeyDown事件。但是捕获指纹的类无法捕获按键。我错过了什么?

This is my Sample File.Xaml.cs code

   protected override void OnKeyDown(KeyEventArgs e)
    {
        if (e.Key == Key.LeftCtrl || e.Key == Key.RightCtrl)
        {

        }
        else
            base.OnKeyDown(e);
    }

 private void button_Click(object sender, RoutedEventArgs e)
    {


            TNTFMT220 tntFmt220 = new TNTFMT220();
            string fingerPrintId = "";
            var data = tntFmt220.ContiniousCaptureFingerPrint(ref fingerPrintId);                          

    }

这是我捕获指纹的代码

   public bool ContiniousCaptureFingerPrint(ref string FingerPrintScanned)
    {
      do
       {
         //get data from device
        }  while(dataReturned);
     return true;
    }

1 个答案:

答案 0 :(得分:-1)

UserControl由一个窗口和一个类组成,当UserControl窗口被聚焦并且您按一个键时,您可以获得一个OnKeyDown事件。

我认为你的TNTFMT220类没有窗口,所以你可以在UserControl或主窗口中生成事件并以不同的方式将它传播到类中,我建议你做几个:

  1. 类属性

    protected override void OnKeyDown(KeyEventArgs e)
    {
        if (e.Key == Key.LeftCtrl || e.Key == Key.RightCtrl)
        {
            tntFmt220.doStop= true;
        }
        else
            base.OnKeyDown(e);
    }
    
    private TNTFMT220 tntFmt220;
    
    private void button_Click(object sender, RoutedEventArgs e)
    {
        tntFmt220 = new TNTFMT220();
        string fingerPrintId = "";
        var data = tntFmt220.ContiniousCaptureFingerPrint(ref fingerPrintId);
    }
    
  2. 类方法

    protected override void OnKeyDown(KeyEventArgs e)
    {
        if (e.Key == Key.LeftCtrl || e.Key == Key.RightCtrl)
        {
            tntFmt220.DoStop();
        }
        else
            base.OnKeyDown(e);
    }
    
    private TNTFMT220 tntFmt220;
    
    private void button_Click(object sender, RoutedEventArgs e)
    {
        tntFmt220 = new TNTFMT220();
        string fingerPrintId = "";
        var data = tntFmt220.ContiniousCaptureFingerPrint(ref fingerPrintId);
    
    }
    
  3. 最重要的是:

    首先,我可能会再次考虑是否需要do while,或者TNTFMT220是否可以在读取数据时生成事件。

    然后,如果你不希望do While阻止你的窗口,你必须在另一个线程中运行它。