GTK# 输入框禁用选项卡移动焦点

GTK# Entry box disable tab moving focus

我想捕获 c# Gtk.SearchEntry 元素中的制表键,这样制表符就不会导致元素失去焦点。我读到你可以通过在 OnKeyPressEvent 函数中返回 false 来做到这一点。但是,这在覆盖 SearchEntry 小部件中的函数时不起作用。

如果我重写 Window 的 OnKeyPressEvent 函数,这确实有效,但是 Tab 键在整个 window 中被阻止,这并不理想...这是我的 SearchEntry class:

internal class NoTabSearchEntry : SearchEntry
{
    protected override bool OnKeyPressEvent(EventKey evnt)
    {
        if (evnt.Key == Key.Tab)
        {
            Console.WriteLine("tab pressed");
            return false;
        }
        return base.OnKeyPressEvent(evnt);
    }
}

"tab pressed" 消息确实得到输出,但 SearchEntry 无论如何都会失去焦点。

知道了...您需要 return true 来自按键事件信号的处理程序以防止默认处理。

其他几个问题。如果您想捕获 shift + tab 键,则需要检查 ISO_Left_tab 键

if (evnt.Key == Key.Tab || evnt.Key == Key.ISO_Left_Tab)

我还想捕获 up/down 方向键。由于某些原因,这些按键没有传递给 OnKeyPressEvent 处理程序;但是,您可以通过像这样添加到 KeyPressEvent 属性来拦截它们:

...
myEntryElement.KeyPressEvent += MyHandler;
...
[GLib.ConnectBefore]
private void MyHandler(object o, KeyPressEventArgs args)
{
    var evnt = args.Event;
    if (evnt.Key == Key.Down || evnt.Key == Key.Up)
    {
        //do stuff
    }
}