TextBox.ContextMenuOpening не запускается в приложении Windows Phone 8.1

#c# #xaml #windows-phone-8

#c# #xaml #windows-phone-8

Вопрос:

Я пишу универсальное приложение для Windows и пытаюсь создать собственное контекстное меню для текстового поля. В приложении Store все работает, как ожидалось, но в приложении Phone событие ContextMenuOpening не запускается. Я пробовал удерживать и касаться выделенного текста, но это не работает, единственное, что происходит, это маленький кружок для отображения копии.

Вот где я регистрирую обработчик событий: (метод вызывается при загрузке страницы)

 public void FlipViewLoaded()
{
    TextBox textBox = GetChildControl<TextBox>
                          (_imagesFlipView, "ReadOnlyTextBox");

    textBox.ContextMenuOpening  =
        new ContextMenuOpeningEventHandler(Open);
}
  

И это обработчик:

 private async void Open(object sender, DoubleTappedRoutedEventArgs e)
{
    e.Handled = true;
    TextBox textbox = (TextBox)sender;
    if (textbox.SelectionLength > 0)
    {
        var menu = new PopupMenu();
        menu.Commands.Add(new UICommand("Get Word", null, 1));
        menu.Commands.Add(new UICommand("Get Text", null, 2));

        var chosenCommand = await menu.ShowAsync(new Point());
        if (chosenCommand != null)
        {
            switch (chosenCommand.Id.ToString())
            {
                 // different commands implementations
            }
         }
         else
         {
            Debug.WriteLine("The chosen command is null !!");
         }
      }
      else
      {
            Debug.WriteLine("The selected _text is null !!");
      }
}
  

Как я уже сказал, он отлично работает в приложении Store (меню отображается, когда я удерживаю выделенный текст или щелкаю по нему правой кнопкой мыши), но событие даже не запускается в приложении Phone.

РЕДАКТИРОВАТЬ Вот часть кода xaml с текстовым полем (остальное — просто стандартный код, который поставляется со страницей концентратор):

      <HubSection>
            <DataTemplate>
                <FlipView x:Name="ImagesFlipView" ItemsSource="{Binding Images}"
                          viewmodel:ImagesPageViewModel.FlipView="{Binding ElementName=ImagesFlipView}">
                    <FlipView.ItemTemplate>
                        <DataTemplate>
                            <Grid>
                                <Image Source="{Binding ImageURL}" />
                                <StackPanel VerticalAlignment="Bottom" HorizontalAlignment="Stretch" >
                                    <TextBox x:Name="TranslationTextBox" Visibility="Visible" 
                                             Height="80" IsReadOnly="True" TextWrapping="Wrap"
                                             BorderThickness="0" Margin="5"
                                             Style="{StaticResource MyTextBoxStyle}"
                                             Background="{StaticResource TextBoxButtonBackgroundThemeBrush}" 
                                             Foreground="White" FontSize="25" VerticalAlignment="Bottom" />
                                    <TextBox x:Name="ReadOnlyTextBox" FontSize="25" IsReadOnly="True" 
                                             Height="80" TextWrapping="Wrap" Text="{Binding Path=Translations[english]}" 
                                             BorderThickness="0" Foreground="White" Margin="5" 
                                             Style="{StaticResource MyTextBoxStyle}"
                                             Background="{StaticResource TextBoxButtonBackgroundThemeBrush}"
                                             VerticalAlignment="Bottom" />
                                </StackPanel>
                            </Grid>
                        </DataTemplate>
                    </FlipView.ItemTemplate>
                </FlipView>
            </DataTemplate>
        </HubSection>
  

Комментарии:

1. Не могли бы вы также предоставить некоторый код со стороны пользовательского интерфейса?

2. Выполнено. Единственное отличие от приложения Store заключается в том, что здесь я использую концентратор, а там нет, но концентратор не вызывает проблемы (я тоже пробовал без него).

Ответ №1:

Ответ прост, в текстовом поле нет события ContextMenuOpening в WindowsPhone.

Поэтому, даже если вы поместите этот код в универсальные приложения, этого не произойдет.

Универсальные приложения только пытаются сопоставить Windows 8.1 с Windows Phone. Если событие или свойство не найдено и соответствие не найдено, оно просто игнорируется.

РЕДАКТИРОВАТЬ: Для завершения ответа вам нужно подумать о другом поведении, когда вы находитесь в своем приложении Windows Phone. Проекты Universal apps определяют переменные предварительной обработки, поэтому вы можете использовать код, подобный

     #if WINDOWSPHONE
var myWindowsPhoneVar = "windowsPhone";
#else
var myWindowsPhoneVar = "!windowsPhone";
#endif
  

Я не совсем уверен, что переменная предварительной обработки для Windows phone — это именно «WINDOWSPHONE», но у вас не возникнет проблем с ее поиском.

Комментарии:

1. Спасибо за ответ, я начал думать, что это тоже может быть так, хотя этого нигде нет в документации (на самом деле там говорится, что это событие существует на обеих платформах). Две переменные — WINDOWS_APP и WINDOWS_PHONE_APP, и я уже использовал их в нескольких местах, просто я не могу придумать лучшего способа в этом конкретном случае.

2. В чем ваш случай? Почему вы отображаете в своем контекстном меню?

3. У меня есть изображение с двумя текстовыми полями — одно с исходным текстом и одно с переводом (не видно в начале). Идея заключается в том, что когда пользователь выбирает слово и удерживает его, появляется контекстное меню, которое дает ему выбор перевести слово (подключается к онлайн-словарю) или весь текст (делает видимым другое текстовое поле). Двойное нажатие также позволяет ему перевести весь текст, но не само слово. Я мог бы добавить кнопку поиска на панель приложений, которая напрямую переводит выбранное слово при нажатии, но я хотел, чтобы обе версии имели одинаковый пользовательский интерфейс.

4. Хорошо, я понимаю. В любом случае пользователи из Windows Phone и из Windows 8 не обязательно имеют одинаковые рефлексы. Поэтому постарайтесь сохранить единство и идентичность между приложениями, но внести небольшие изменения в пользовательский интерфейс в зависимости от платформы — это неплохо