CoreTextServicesManager не работает должным образом

Я хочу получить текстовый ввод CoreTextServicesManager, но событие TextUpdating даже не запускается. В моем проекте UWP он работает нормально.

Вот как я создаю службу:

CoreTextServicesManager manager = CoreTextServicesManager.GetForCurrentView();
CoreTextEditContext EditContext = manager.CreateEditContext();
EditContext.InputPaneDisplayPolicy = CoreTextInputPaneDisplayPolicy.Manual;
EditContext.InputScope = CoreTextInputScope.Text;
EditContext.TextRequested += delegate { };
EditContext.SelectionRequested += delegate { };
EditContext.TextUpdating += EditContext_TextUpdating;
EditContext.FocusRemoved += EditContext_FocusRemoved;

EditContext.NotifyFocusEnter(); 

Вот мои события:

private void EditContext_TextUpdating(CoreTextEditContext sender, 
CoreTextTextUpdatingEventArgs args)
{
   Debug.WriteLine(args.Text);
}
private void EditContext_FocusRemoved(CoreTextEditContext sender, object args)
{
    Debug.WriteLine("Lost focus");
}

Почему событие TextUpdating не запускается? Что я делаю неправильно?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
61
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Я не уверен, что вы уже видели это (поздний ответ после того, как я нашел этот вопрос в Google), но, к сожалению, поддержка некоторых API-интерфейсов UWP была прекращена. В этой статье предлагаются некоторые замены и обходные пути для некоторых из них. https://learn.microsoft.com/en-gb/windows/apps/desktop/modernize/desktop-to-uwp-supported-api

Ну да, это я уже видел. Как написано в документации, CoreTextServicesManager в настоящее время поддерживается только в Insiderbuilds. Очень надеюсь на поддержку в следующем обновлении. Спасибо за ваш ответ. Я все равно отмечу это как ответ

FrozenAssassine 25.12.2022 21:14

У нас это работает в нашем приложении UWP. Убедитесь, что вы находитесь в основной теме

        imeInputPane = CoreInputView.GetForCurrentView();
        imeInputPane.PrimaryViewShowing += ImeInputPane_PrimaryViewShowing;
        imeInputPane.PrimaryViewHiding += ImeInputPane_PrimaryViewHiding;

        imeTextContext = CoreTextServicesManager.GetForCurrentView().CreateEditContext();

        // Manually control when soft keyboard shows.  When hard keyboard is attached, the
        // soft keyboard will never show.
        imeTextContext.InputPaneDisplayPolicy = CoreTextInputPaneDisplayPolicy.Manual;

        // the default keyboard is general purpose soft keyboard, has no affect with hard keyboard
        imeTextContext.InputScope = CoreTextInputScope.Text;

        imeTextContext.TextRequested += IMETextContext_TextRequested;
        imeTextContext.SelectionRequested += IMETextContext_SelectionRequested;
        imeTextContext.FocusRemoved += IMETextContext_FocusRemoved;
        imeTextContext.TextUpdating += IMETextContext_TextUpdating;
        imeTextContext.SelectionUpdating += IMETextContext_SelectionUpdating;
        imeTextContext.FormatUpdating += IMETextContext_FormatUpdating;
        imeTextContext.LayoutRequested += IMETextContext_LayoutRequested;
        imeTextContext.CompositionStarted += IMETextContext_CompositionStarted;
        imeTextContext.CompositionCompleted += IMETextContext_CompositionCompleted;

...

    private void IMETextContext_TextUpdating(CoreTextEditContext sender, CoreTextTextUpdatingEventArgs args)
    {
         string origText = imeText;
         CoreTextRange range = args.Range;
         CoreTextRange newSelection = args.NewSelection;
        
         //Modify the internal text store for the IME
         imeText = imeText.Substring(0, range.StartCaretPosition)
              + args.Text
              + imeText.Substring(Math.Min(imeText.Length, 
              range.EndCaretPosition));
        
         newSelection.EndCaretPosition = newSelection.StartCaretPosition;
        
         Debug.WriteLine(string.Format("IME SendReplaceText Orig Text '{0}'  New Text '{1}'  StartCaret '{2}'  EndCaret '{3}'", origText, imeText, imeSelection.StartCaretPosition, imeSelection.EndCaretPosition - imeSelection.StartCaretPosition));
        
         // Do something with the text
         SendReplaceText(args.Text                               // new text
              , range.StartCaretPosition                           // start position
              , range.EndCaretPosition - range.StartCaretPosition  // length of former text that is being replaced
              , args.Text.Length);                                 // length of the modified text
        
         imeSelection = newSelection;
         args.Result = CoreTextTextUpdatingResult.Succeeded;
    }
        
    private void IMEBypassControl_OnShowKeyboard(object sender, IMEBypassShowKeyboardEventArgs e)
    {
         try
         {
              if (e.Visible)
              {
                  Task.Run(async () =>
                  {
                      if (MiscUtils.AreWeOnMainUIThread)
                      {
                          try
                          {
                              LOG.LogV(string.Format("IME Show Keyboard '{0}' Start '{1}'  Total Size '{2}", e.Text, e.CursorPosition, e.FetchSize));
        
                              //Debug.WriteLine(string.Format("IME Show Keyboard '{0}' Start '{1}'  Total Size '{2}", e.Text, e.CursorPosition, e.FetchSize));
                              imeTextContext.InputScope = CoreTextInputScope.Text;
                              imeText = e.Text;
                              imeSelection.StartCaretPosition = e.CursorPosition;
                              imeSelection.EndCaretPosition = e.CursorPosition;
                                            
                              imeTextContext.NotifyTextChanged(imeSelection, e.Text.Length, imeSelection);
        
                              SetFocus();
                          }
                          catch (Exception ex)
                          {
                              LOG.LogE(ex);
                          }
                      }
                      else
                      {
                          await MiscUtils.CallOnMainViewUiThreadAsync(() =>
                          {
                          try
                          {
                              LOG.LogV(string.Format("IME Show Keyboard '{0}' Start '{1}'  Total Size '{2}", e.Text, e.CursorPosition, e.FetchSize));
        
                              //Debug.WriteLine(string.Format("IME Show Keyboard '{0}' Start '{1}'  Total Size '{2}", e.Text, e.CursorPosition, e.FetchSize));
                              imeTextContext.InputScope = CoreTextInputScope.Text;
                              imeText = e.Text;
                              imeSelection.StartCaretPosition = e.CursorPosition;
                              imeSelection.EndCaretPosition = e.CursorPosition;
                                            
                              imeTextContext.NotifyTextChanged(imeSelection, e.Text.Length, imeSelection);
        
                              SetFocus();
                          }
                          catch (Exception ex)
                          {
                              LOG.LogE(ex);
                          }
                          });
                      }
                  }).GetAwaiter().GetResult();
              }
              else
              {
                  RemoveFocus();
              }
          }
          catch (Exception ex)
          {
              LOG.LogE(ex);
          }
      }
      else
      {
          RemoveFocus();
      }
  }

  private void SetFocus()
  {
      imeTextContext.NotifyFocusEnter();
  }

  public void RemoveFocus()
  {
      if (MiscUtils.AreWeOnMainUIThread)
      {
          imeTextContext.NotifyFocusLeave();
          imeInputPane.TryHide();
      }
      else
      {
          Task.Run(async () =>
          {
               await MiscUtils.CallOnMainViewUiThreadAsync(() =>
               {
                   imeTextContext.NotifyFocusLeave();
                   imeInputPane.TryHide();
               });
          }).GetAwaiter().GetResult();
      }
  }


 

Другие вопросы по теме