winform 烦人的键盘事件 再遇上 chart 上下左右 失灵

winform  烦人的键盘事件 再遇上 chart  上下左右 失灵

AI 用多了会失去思考耐心

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Windows.Forms.DataVisualization.Charting;namespace TestForm
{public partial class UserControl2 : UserControl{public UserControl2(){InitializeComponent();// 启用 UserControl 自身的键盘事件this.SetStyle(ControlStyles.StandardClick | ControlStyles.StandardDoubleClick | ControlStyles.UserMouse, true);this.SetStyle(ControlStyles.Selectable, true);this.TabStop = true;Chart ct = new Chart();ct.PreviewKeyDown += OnPreviewKeyDown;this.Controls.Add(ct);// 订阅 UserControl 自身的事件this.KeyDown += ChildControl_KeyDown;this.KeyUp += ChildControl_KeyUp;this.PreviewKeyDown += OnPreviewKeyDown;// 为所有现有控件订阅事件SubscribeToChildControls(this);// 为新添加的控件订阅事件this.ControlAdded += (s, e) => SubscribeToControl(e.Control);}private void OnPreviewKeyDown(object sender, PreviewKeyDownEventArgs e){switch (e.KeyCode){case Keys.Up:case Keys.Down:case Keys.Left:case Keys.Right:case Keys.Space:e.IsInputKey = true;break;}}private void SubscribeToChildControls(Control parent){foreach (Control control in parent.Controls){SubscribeToControl(control);SubscribeToChildControls(control); // 递归订阅子控件
            }}private void SubscribeToControl(Control control){control.KeyDown += ChildControl_KeyDown;control.KeyUp += ChildControl_KeyUp;control.PreviewKeyDown += OnPreviewKeyDown;}private void ChildControl_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e){// 将空格键标记为输入键,这样KeyUp事件才会触发if (e.KeyCode == Keys.Space){e.IsInputKey = true;}}private void ChildControl_KeyDown(object sender, KeyEventArgs e){if (e.KeyCode == Keys.Space){Console.WriteLine("空格键按下 - 时间: " + DateTime.Now.ToString("HH:mm:ss.fff"));e.Handled = true; // 阻止默认处理
            }if (e.KeyCode == Keys.Up){Console.WriteLine("上键按下 - 时间: " + DateTime.Now.ToString("HH:mm:ss.fff"));e.Handled = true; // 阻止默认处理
            }if (e.KeyCode == Keys.Down){Console.WriteLine("下键按下 - 时间: " + DateTime.Now.ToString("HH:mm:ss.fff"));e.Handled = true; // 阻止默认处理
            }if (e.KeyCode == Keys.Left){Console.WriteLine("左键按下 - 时间: " + DateTime.Now.ToString("HH:mm:ss.fff"));e.Handled = true; // 阻止默认处理
            }if (e.KeyCode == Keys.Right){Console.WriteLine("右键按下 - 时间: " + DateTime.Now.ToString("HH:mm:ss.fff"));e.Handled = true; // 阻止默认处理
            }if (e.KeyCode == Keys.Enter){Console.WriteLine("回车键按下 - 时间: " + DateTime.Now.ToString("HH:mm:ss.fff"));e.Handled = true; // 阻止默认处理
            }}private void ChildControl_KeyUp(object sender, KeyEventArgs e){if (e.KeyCode == Keys.Space){Console.WriteLine("空格键释放 - 时间: " + DateTime.Now.ToString("HH:mm:ss.fff"));e.Handled = true; // 阻止默认处理
            }}}
}