MenuFlyout не удается - PullRequest
       13

MenuFlyout не удается

0 голосов
/ 22 апреля 2020

У меня возникают некоторые проблемы с 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 работает нормально.

...