2

在阅读了这个问题这个接受的答案之后,我尝试在 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# 代码?

4

1 回答 1

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#.

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

于 2012-10-22T20:13:11.417 回答