1

ユーザーが応答を入力するためにNSTextViewを使用しています。継続的なスペルチェックをオンにしましたが、間違った単語の下に赤い線が表示されます。使用している共有のSpellCheckerがあります。しかし、私はユーザーに右クリックしてスペルを修正してもらいたいです。次の質問があります-

  1. テキストエディットでは、右クリックするとすぐに単語が強調表示されますが、どうすれば同じことができますか?選択した範囲を取得して、スペルチェッカーに渡すことを計画しています。

  2. スペルチェックの提案がコンテキストメニューに追加された後も、次の単語に移動しても表示されるので、新しい項目を追加する前に、常にコンテキストメニューをクリアする必要がありますか?

  3. Monobjcを使用していますが、次のコードを実行すると、例外が発生します-

    var t = Menu.ItemArray;

    foreach(var s in t)

    {{

    var menuItem = s.CastAs <NSMenuItem>(); //例外

    }

私は基本的に、個々のNSMenuItemを取得して、スペルの提案か何か他のものかどうかを確認しようとしています。

編集-スタックトレースを追加

System.InvalidCastException: Cannot cast from source type to destination type.
  at example.test.MacOS.UI.HTML.ESView.MenuForEvent (Monobjc.Cocoa.NSEvent theEvent) [0x00000] in <filename unknown>:0 
  at Monobjc.Dynamic.Proxies.example.test.MacOS.UI.HTML.ESView.MenuForEvent_Monobjc_Cocoa_NSEvent (IntPtr receiver, IntPtr selector, IntPtr ) [0x00000] in <filename unknown>:0 
  at (wrapper native-to-managed) Monobjc.Dynamic.Proxies.example.test.MacOS.UI.HTML.ESView:MenuForEvent_Monobjc_Cocoa_NSEvent (intptr,intptr,intptr)
  at (wrapper managed-to-native) E5EEC20A:pinvoke (intptr,intptr,intptr)
  at E5EEC20A.objc_msgSendSuper (IntPtr receiver, IntPtr selector, System.Object[] parameters) [0x00000] in <filename unknown>:0 
  at Monobjc.Bridge.Generators.DynamicMessagingGenerator.SendMessage (System.String message, IntPtr receiver, IntPtr selector, System.Object[] parameters) [0x00000] in <filename unknown>:0 
  at Monobjc.ObjectiveCRuntime.SendMessageSuper (IManagedWrapper receiver, Monobjc.Class cls, System.String selector, System.Object[] parameters) [0x00000] in <filename unknown>:0 
  at Monobjc.Id.SendMessageSuper (Monobjc.Class cls, System.String selector, System.Object[] parameters) [0x00000] in <filename unknown>:0 
  at example.test.MacOS.UI.App.Application.SendEvent (Monobjc.Cocoa.NSEvent theEvent) [0x00000] in <filename unknown>:0 
  at Monobjc.Dynamic.Proxies.example.test.MacOS.UI.App.Application.SendEvent_Monobjc_Cocoa_NSEvent (IntPtr receiver, IntPtr selector, IntPtr ) [0x00000] in <filename unknown>:0 
  at (wrapper native-to-managed) Monobjc.Dynamic.Proxies.example.test.MacOS.UI.App.Application:SendEvent_Monobjc_Cocoa_NSEvent (intptr,intptr,intptr)
  at (wrapper managed-to-native) Monobjc.ObjectiveCRuntime:objc_msgSend (intptr,intptr)
  at Monobjc.ObjectiveCRuntime.SendMessage (IManagedWrapper receiver, System.String selector) [0x00000] in <filename unknown>:0 
  at Monobjc.Cocoa.NSApplication.Run () [0x00000] in <filename unknown>:0 
  at example.test.MacOS.UI.App.Application.RunApplication () [0x00000] in <filename unknown>:0 
  at example.test.MacOS.Program.Main (System.String[] args) [0x00000] in <filename unknown>:0 

編集-ステップ3

質問3は、Laurentの提案に基づいて機能しました。

4

1 に答える 1

3

ポイント1)

  • NSTextView.SelectedRange最初に選択された範囲を返します。テキストが選択されていない場合、範囲の長さは0であり、範囲の位置はカーソルが置かれている文字のインデックスです。
  • 次に、文字列コンテキスト(NSTextView.TextStorage.String)への参照を取得し、カーソル位置の前後の空白を検索します。選択する単語の範囲が表示されます。
  • NSTextView.SelectedRange新しい選択範囲を指定するために使用します。

ポイント2の場合)

右クリックが行われたときに返されるMenuインスタンスを完全に制御できます。したがって、アイテムを追加する場合は、自分で削除する必要があります。

ポイント3)

バグのようです。コメントで述べたように、インデックス付きループ内でNumberOfItemsandメソッドを使用します。ItemAtIndex

于 2011-06-01T07:13:01.483 に答える