У меня возникают некоторые проблемы с MenuFlyouts при отображении срабатывания события RightTapped на некоторых MapItems и ListViewItems, поэтому я предположил, что это происходит и с другими элементами управления.
Итак, когда я открываю первый MenuFlyout, он работает нормально. Я выбираю другой MapItem и открываю его MenuFlyout, затем он снова работает нормально. НО, если я открою MenuFlyout, пока не закрыл предыдущий, он открывается, но новый фон MenuFlyout становится черным, а элементы MenuFlyout, содержащие (Edit, View, ...), не реагируют на щелчок мыши , ни нажмите, ... Если я пытаюсь открыть другой MenuFlyout, после закрытия предыдущего или без закрытия, он снова работает нормально.
Затем я отладил, чтобы следить за тем, что происходит за кулисами, и обнаружил, что, когда все идет хорошо, событие запускается в следующем (открытый процесс):
- Открытие
- Закрытие
- Закрытие
- Открытие
- Открытие
Процесс закрытия (нормально):
Процесс неудачного открытия:
- Закрытие
- Закрытие
- Закрытие
- Открытие
- Открыто
Смотри, что некоторые события запускаются дважды, и при открытии в порядке первые три события немного странные (начинает открываться, закрывается чтобы открыть его снова).
В окне вывода нет сообщений об ошибках и исключениях.
Почему это происходит? Как я могу это исправить?
Может быть, есть какая-то проблема, когда пытается показать второй MenyFlyout и это невозможно? В таком случае, как я могу закрыть предыдущий, прежде чем показывать следующий?
Ниже приведен весь код, который, я думаю, будет полезен.
Спасибо
Мой MenuFlyout является ContextFlyout. Вот код XAML:
<Maps:MapItemsControl x:Name="mapSpotsItems">
<Maps:MapItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel x:Name="spotPin" Visibility="{Binding isVisible}" Maps:MapControl.NormalizedAnchorPoint="{Binding NormalizedAnchorPoint}"
Maps:MapControl.Location="{Binding geopoint}" Tag="{Binding ID}" ToolTipService.ToolTip="{Binding AdvancedDescription}"
RenderTransformOrigin="0.5,1"
Tapped="spotPin_Tapped" DoubleTapped="spotPin_DoubleTapped" RightTapped="spotPin_RightTapped"
PointerEntered="spotPin_PointerEntered" PointerExited="spotPin_PointerExited"
>
<StackPanel.ContextFlyout>
<MenuFlyout Closing="MenuFlyout_Closing" Closed="MenuFlyout_Closed" Opened="MenuFlyout_Opened" Opening="MenuFlyout_Opening">
<MenuFlyout.MenuFlyoutPresenterStyle>
<Style TargetType="MenuFlyoutPresenter">
<Setter Property="Background" Value="{ThemeResource AcrylicDarkGrey50Background}"/>
<Setter Property="BorderBrush" Value="{ThemeResource DarkGrey10ThemeColor}"/>
</Style>
</MenuFlyout.MenuFlyoutPresenterStyle>
<MenuFlyoutItem Text="Open in Planner" Tag="{Binding ID}" Tapped="spotOpenInPlannerFlyoutItem_Tapped">
</MenuFlyoutItem>
<MenuFlyoutSeparator />
<MenuFlyoutItem Text="View" Tag="{Binding ID}" Tapped="spotViewFlyoutItem_Tapped">
</MenuFlyoutItem>
<MenuFlyoutItem Text="Edit" Tag="{Binding ID}" Tapped="spotEditFlyoutItem_Tapped">
</MenuFlyoutItem>
<MenuFlyoutSeparator Visibility="{Binding Exportable}"/>
<MenuFlyoutItem Text="Move" Tag="{Binding ID}" Tapped="spotMoveFlyoutItem_Tapped">
</MenuFlyoutItem>
<MenuFlyoutSeparator/>
<MenuFlyoutItem Text="Export" Tag="{Binding ID}" Visibility="{Binding Exportable}" Tapped="spotExportFlyoutItem_Tapped">
</MenuFlyoutItem>
<MenuFlyoutSeparator Visibility="{Binding Exportable}" />
<MenuFlyoutItem Text="Delete" Tag="{Binding ID}" Tapped="spotDeleteFlyoutItem_Tapped">
</MenuFlyoutItem>
</MenuFlyout>
</StackPanel.ContextFlyout>
<StackPanel Orientation="Horizontal" Background="{StaticResource SpotBackgroundColor}" Tag="{Binding ID}">
<Grid>
<Rectangle Width="22" Height="22" Opacity="0.5"/>
<Image Source="{Binding MainTag}" Height="20" Width="20" HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Grid>
<Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
<TextBlock Text="{Binding Title}" Margin="5,0" HorizontalAlignment="Center" VerticalAlignment="Center"
Width="50"
MaxLines="2" TextWrapping="WrapWholeWords" TextTrimming="CharacterEllipsis" LineHeight="11"
Style="{StaticResource BaseTextBlockStyle}"
FontSize="11" FontWeight="Normal" Foreground="{ThemeResource SpotForegroundColor}" />
</Grid>
</StackPanel>
<Canvas HorizontalAlignment="Center">
<Polygon Fill="{StaticResource SpotBackgroundColor}" Points="-5,0, 0,10, 5,0, -5,0" />
</Canvas>
</StackPanel>
</DataTemplate>
</Maps:MapItemsControl.ItemTemplate>
</Maps:MapItemsControl>
И C#, открывающий MenuFlyout:
private async void spotPin_RightTapped(object sender, RightTappedRoutedEventArgs e)
{
onSpotPin = true;
StackPanel sp = sender as StackPanel;
sp.ContextFlyout.ShowAt((FrameworkElement)sender);
await Task.Delay(globalVars.SINGLE_TAP_MIN_TIME * 2);
onSpotPin = false;
}
Здесь события MenuFlyouts (почему типы параметров Opening, Opened и Closed являются объектами и Закрытие, с другой стороны, имеет свои собственные?):
private void MenuFlyout_Opening(object sender, object e)
{
}
private void MenuFlyout_Opened(object sender, object e)
{
}
private void MenuFlyout_Closed(object sender, object e)
{
}
private void MenuFlyout_Closing(FlyoutBase sender, FlyoutBaseClosingEventArgs args)
{
}
ОБНОВЛЕНО:
После попытки различными способами, наконец, я достиг своей цели: Я создал MenuFlyout и все элементы, содержащие код.
Несмотря на результат, по пути я понял, что добавление или отображение MenuFlyout по коду также имеет свои проблемы.
Любопытно, что при отображении MenuFlyout, созданного с помощью кода и присоединении к элементу управления, при использовании этой строки кода:
f.ShowAt(sender as FrameworkElement);
Он работает нормально и удовлетворяет моим потребностям, но если использовать та же команда, но со вторым параметром, она терпит неудачу, как объяснено ранее:
f.ShowAt(sender as FrameworkElement, e.GetPosition(sender as FrameworkElement));
Любая идея, почему?
2-е ОБНОВЛЕНИЕ И РЕШЕНИЕ
При работе с XAML (MenuFlyout определен в XAML) вместо события Tap следует выбирать событие Click.
Когда MenuFlyout создается в коде, событие Tap работает нормально.