【发布时间】:2016-01-07 23:22:59
【问题描述】:
我正在尝试使用 monoMac 和 Xamarin Studio 处理 NSTextField 的 keyDown 事件。
我创建了一个 NSTextFieldDelegate 派生类并将编辑器委托设置为此类的一个实例。但是,我只看到调用了 Changed 方法,而不是 DoCommandBySelector
class TextPathDelegate : NSTextFieldDelegate {
public override void Changed(NSNotification notification)
{
Console.WriteLine("changed");
}
public override void DidChangeValue(string forKey)
{
Console.WriteLine("didchange = {0}", forKey);
}
public override void WillChangeValue(string forKey)
{
Console.WriteLine("willchange = {0}", forKey);
}
public override bool DoCommandBySelector(NSControl control, NSTextView textView, MonoMac.ObjCRuntime.Selector commandSelector)
{
Console.WriteLine("DoCommandBySelector = {0}", commandSelector.ToString());
return false;
}
}
知道我可能缺少什么吗?
Edit-2: 我刚刚注意到,如果我使用箭头键和向上/向下翻页,则会调用 DoCommandBySelector。仍然无法捕捉到 keydown 事件
Edit-1: 我尝试使用 Xamarin.mac 制作一个小项目,只有 2 个编辑字段,以及派生的编辑控件和委托。
这是代码
class TextPathDelegate : NSTextFieldDelegate {
string Id { get; set; }
public TextPathDelegate(string id) { Id = id; }
public override void Changed(NSNotification notification)
{
Console.WriteLine(Id + "changed");
}
public override bool DoCommandBySelector(NSControl control, NSTextView textView, ObjCRuntime.Selector commandSelector)
{
Console.WriteLine(Id + "DoCommandBySelector = {0}", commandSelector.ToString());
return false;
}
public override void EditingBegan(NSNotification notification)
{
Console.WriteLine(Id + "EditingBegan");
}
public override void EditingEnded(NSNotification notification)
{
Console.WriteLine(Id + "EditingEnded");
}
}
[Register("MyNSTextField")]
class MyNSTextField : NSTextField {
public MyNSTextField(IntPtr handle) : base(handle){}
public override void KeyDown(NSEvent theEvent)
{
Console.WriteLine("KeyDown");
base.KeyDown(theEvent);
}
public override void KeyUp(NSEvent theEvent)
{
Console.WriteLine("KeyUp");
base.KeyUp(theEvent);
}
}
和输出。不调用 keyDown 或 DoCommandBySelector。我一定错过了一些非常基本的东西
1-EditingBegan
1-changed
KeyUp
1-changed
KeyUp
1-changed
KeyUp
1-EditingEnded
2-EditingBegan
2-changed
KeyUp
2-changed
KeyUp
2-changed
KeyUp
谢谢
【问题讨论】:
-
问题标题解决了“keyDown”问题,问题正文询问从未看到 DoCommandBySelector 方法被调用...您是在尝试捕获 NSTextField 上的 keydown 还是尝试让 DoCommandBySelector 触发?
-
好吧,在阅读了其他一些帖子之后,似乎 doCommandBySelector 是这样做的方法。有没有其他方法可以做到这一点?我确实尝试派生 NSTextField 并覆盖 keyDown 但我(在某处)读到这不是正确的方法,而是应该通过委托处理。我(如您所知)是 Cocoa 的新手(WPF 背景)。
-
另外你可能想看看创建一个自定义的
NSFormatter.. 但同样,这取决于你想要用 KeyDown 控制...