如何在按下返回键的情况下使用MonoMac在NSTextField中插入回车符?

时间:2012-10-20 16:45:04

标签: c# objective-c macos cocoa monomac

在与this question一起阅读this accepted answer之后,我尝试在C#中使用MonoMac实现给定的Objective-C解决方案:

- (BOOL)control:(NSControl*)control
    textView:(NSTextView*)textView
    doCommandBySelector:(SEL)commandSelector
{
    BOOL result = NO;

    if (commandSelector == @selector(insertNewline:))
    {
        // new line action:
        // always insert a line-break character and don’t cause the receiver
        // to end editing
        [textView insertNewlineIgnoringFieldEditor:self]; 
        result = YES;
    }

    return result;
}

我设法将一个委托分配给我的文本框并覆盖DoCommandBySelector方法。我没有管理的是翻译行

if (commandSelector == @selector(insertNewline:))

和行

[textView insertNewlineIgnoringFieldEditor:self]; 

进入C#等价物,即使经过数小时的尝试和错误,以及大量的“谷歌搜索”,每个人都在谈论。

所以我的问题是:

如何将上述两行转换为可用的MonoMac C#代码?

1 个答案:

答案 0 :(得分:4)

好的,经过另一堆尝试和错误后,我提出了以下工作解决方案。

这是我将委托分配给文本字段的地方:

textMessage.Delegate = new MyTextDel();

这是实际的委托定义:

private class MyTextDel : NSTextFieldDelegate
{
    public override bool DoCommandBySelector (
        NSControl control, 
        NSTextView textView, 
        Selector commandSelector)
    {
        if (commandSelector.Name == "insertNewline:") {
            textView.InsertText (new NSString (Environment.NewLine));
            return true;
        }

        return false;
    }
}

所以要回答我自己的问题:

if (commandSelector == @selector(insertNewline:))         // Objective-C.

转换为:

if (commandSelector.Name == "insertNewline:")             // C#.

这一行:

[textView insertNewlineIgnoringFieldEditor:self];         // Objective-C.

将(粗略地)翻译为:

textView.InsertText (new NSString (Environment.NewLine)); // C#.

我希望这在所有情况下都有效,我的第一次测试看起来很有希望。