NSTextView中的上下文菜单

问题描述

| 我正在为用户使用NSTextView键入他们的响应。我打开了连续拼写检查,不正确的单词下面有一条红线。我有一个共享的SpellChecker,正在使用中。但我希望用户右键单击并更正拼写。我有以下问题- 在“文本编辑”中,右键单击该单词会突出显示该单词,我该如何实现?我打算获取selectedrange并将其传递给拼写检查器。 将拼写检查建议添加到上下文菜单后,当我转到下一个单词时它仍会显示,因此在添加任何新项目之前,我应始终清除上下文菜单吗? 我正在使用Monobjc,当我执行以下代码时,出现异常- var t = Menu.ItemArray; foreach(t中的var s) { var menuItem = s.CastAs (); //例外 } 我基本上是尝试让个人NSMenuItem检查它是否拼写建议或其他。 编辑-添加了stacktrace
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)
  at E5EEC20A.objc_msgSendSuper (IntPtr receiver,System.Object[] parameters) [0x00000] in <filename unkNown>:0 
  at Monobjc.Bridge.Generators.DynamicmessagingGenerator.SendMessage (System.String message,IntPtr receiver,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.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 ) [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)
  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是根据洛朗的建议进行的。     

解决方法

        对于第1点)
NSTextView.SelectedRange
返回第一个选定范围。如果未选择任何文本,则范围的长度为0,范围的位置为光标所在字符的索引。 然后,获取对字符串上下文(
NSTextView.TextStorage.String
)的引用,并在光标位置之前和之后搜索空格。您将获得选择单词的范围。 用
NSTextView.SelectedRange
指定新的选择范围。 对于第2点) 右键单击后,您可以完全控制返回的Menu实例。因此,如果向其中添加项目,则必须自己删除它们。 对于第3点) 看起来像个错误。如注释中所述,在索引循环中使用
NumberOfItems
ItemAtIndex
方法。