#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 не обязательно имеют одинаковые рефлексы. Поэтому постарайтесь сохранить единство и идентичность между приложениями, но внести небольшие изменения в пользовательский интерфейс в зависимости от платформы — это неплохо