Контекстное меню в NSTextView - PullRequest
1 голос
/ 31 мая 2011

Я использую NSTextView, чтобы пользователь мог ввести свой ответ.Я включил непрерывную проверку орфографии, и у неправильных слов есть красная линия под ними.У меня есть общий SpellChecker, который я использую.Но я хочу, чтобы пользователь сделал правый клик и исправил орфографию.У меня есть следующие вопросы -

  1. В текстовом редакторе, как только вы щелкнете правой кнопкой мыши, будет выделено слово, как я могу добиться того же?Я планирую получить выбранный диапазон и передать его проверке орфографии.

  2. Как только предложения проверки орфографии добавляются в контекстное меню, они все равно отображаются при переходе к следующему слову, поэтомуя должен всегда очищать контекстное меню перед добавлением любого нового элемента?

  3. Я использую Monobjc, и когда я выполняю следующий код, я получаю исключение -

    var t = Menu.ItemArray;

    foreach(var s in t)

    {

    var menuItem = s.CastAs ();// исключение

    }

Я в основном пытаюсь заставить отдельный NSMenuItem проверять, есть ли в нем варианты правописания или что-то еще.

EDIT - добавлена ​​трассировка стека

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 работал на основе предложения Лорана.

1 Ответ

3 голосов
/ 01 июня 2011

Для пункта 1)

  • NSTextView.SelectedRange возвращает первый выбранный диапазон. Если текст не выделен, длина диапазона равна 0, а местоположение диапазона - это индекс символа, в котором находится курсор.
  • Затем получите ссылку на контекст строки (NSTextView.TextStorage.String) и найдите пробел до и после расположения курсора. Вы получите диапазон для слова для выбора.
  • Используйте NSTextView.SelectedRange, чтобы указать новый диапазон выбора.

Для пункта 2)

Вы имеете полный контроль над экземпляром Menu, возвращаемым после щелчка правой кнопкой мыши. Поэтому, если вы добавляете к нему элементы, вы должны удалить их самостоятельно.

Для пункта 3)

Похоже, ошибка. Как упомянуто в комментарии, используйте методы NumberOfItems и ItemAtIndex в индексированном цикле.

...