UWP Grid.ContextFlyout не открывается - PullRequest
0 голосов
/ 11 октября 2018

В моем приложении UWP у меня есть представление списка в главном окне, и у меня есть дополнительное окно.Каждый элемент представления списка в моем представлении списка - это Grid, и у меня есть Grid.ContextFlyout для сетки.ContextFlyout содержит MenuFlyout с 4 MenuFlyoutItem.

Я открываю свое приложение, в представлении списка главного окна я щелкаю правой кнопкой мыши элемент.Я вижу открытие ContextFlyout и срабатывание EventHandler<object> Opened.

Теперь я открываю вторичное окно моего приложения и закрываю главное окно.Снова я открываю главное окно своего приложения, открывая свое приложение из меню «Пуск».

Теперь, если я щелкну правой кнопкой мыши по тому же элементу в представлении списка, которое я щелкнул ранее, я мог видеть, как срабатывает EventHandler<object> Opened,но всплывающий контекст не открывается в пользовательском интерфейсе.

Эта проблема возникает только в описанном выше сценарии (1. откройте приложение, 2. щелкните правой кнопкой мыши элемент, 3. откройте вторичное окно, 4. закройте главноеокно, 5. снова откройте главное окно приложения из меню «Пуск», 6. щелкните правой кнопкой мыши элемент)

Ниже моя сетка

<Grid
    Name="RootGrid">
    <Grid.ContextFlyout>
        <MenuFlyout
            x:Name="OptionsFlyout"
            Opening="Flyout_Opening" 
            Opened="Flyout_Opened"
            Closed="Flyout_Closed">
            <MenuFlyoutItem Name="Item1"/>
            <MenuFlyoutItem Name="Item2"/>
            <MenuFlyoutItem Name="Item3"/>
            <MenuFlyoutItem Name="Item4"/>
        </MenuFlyout>
    </Grid.ContextFlyout>
    <TextBlock Text="MyGridItem"/>
</Grid>

В моем App.xaml.cs я используюприведенный ниже код в методе OnLaunched для восстановления моего главного окна

protected override async void OnLaunched(LaunchActivatedEventArgs e)
{
    Window.Current.Dispatcher.RunOnUIThread(async () =>
    {
      tryShow = await ApplicationViewSwitcher.TryShowAsStandaloneAsync(ApplicationView.GetApplicationViewIdForWindow(CoreApplication.GetCurrentView().CoreWindow), ViewSizePreference.Default, e.CurrentlyShownApplicationViewId, ViewSizePreference.Default);
    });
}

Я что-то упускаю при открытии / восстановлении моего главного окна, которое было закрыто ранее?Или можно что-нибудь сделать, чтобы решить эту проблему?

Ниже приведена ссылка на github для примера приложения, созданного мной для воспроизведения этой проблемы. UWP Grid Контекстное меню

Ответы [ 2 ]

0 голосов
/ 07 ноября 2018

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

"Если открыты дополнительные виды, окно основного вида можетбыть скрытым - например, нажав кнопку закрытия (x) в строке заголовка окна - но его поток остается активным. "

Начиная с 1703, главное окно может обрабатывать событие запроса закрытия.После закрытия код может переключиться на дополнительное окно, скрывая главное окно.Затем сообщите системе, что вы обработали закрытие самостоятельно, установив для свойства Handled значение true.

В appxmanifest добавьте возможность verifyAppClose.

<Capabilities>
     <Capability Name="internetClient" />
     <rescap:Capability Name="confirmAppClose"/> 
</Capabilities>

Теперь обработайте событие CloseRequested.Вот как выглядит код:

    private int MainViewId;
    private int SecondViewId;

    public MainPage()
    {
        this.InitializeComponent();
        SystemNavigationManagerPreview.GetForCurrentView().CloseRequested += MainPage_CloseRequested;
    }

    private async void MainPage_CloseRequested(object sender, SystemNavigationCloseRequestedPreviewEventArgs e)
    {   
        // Switch to Secondary window, Hide main window                          
        await ApplicationViewSwitcher.SwitchAsync(
                SecondViewId,
                MainViewId,
                ApplicationViewSwitchingOptions.ConsolidateViews);

        // The close was handled, don't do anything else
        e.Handled = true;
    }

    private async void Button_Tapped(object sender, TappedRoutedEventArgs e)
    {
        MainViewId = ApplicationView.GetForCurrentView().Id;
        var newCoreApplicationView = CoreApplication.CreateNewView();             

        await newCoreApplicationView.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
        {
            SecondViewId = ApplicationView.GetForCurrentView().Id;

            Window SecondWindow = Window.Current;
            var frame = new Frame();
            frame.Navigate(typeof(Assets.SecondWindow));
            SecondWindow.Content = frame;
            SecondWindow.Activate();
        });

        await ApplicationViewSwitcher.TryShowAsStandaloneAsync(SecondViewId, ViewSizePreference.Default);
    }
0 голосов
/ 18 октября 2018

Эта проблема возникает только в описанном выше сценарии (1. откройте приложение, 2. щелкните правой кнопкой мыши элемент, 3. откройте дополнительное окно, 4. закройте главное окно, 5. откройте главное окно приложенияснова из меню «Пуск», 6. щелкните правой кнопкой мыши элемент)

Я мог бы воспроизвести эту проблему.Я сообщил в соответствующую команду.Вы также можете отправить его в наш Центр обратной связи.

Вот обходной путь для вас.Вы можете использовать FlyoutBase.AttachedFlyout вместо «ContextFlyout».Вам просто нужно зарегистрировать событие RightTapped таблицы и добавить небольшой код, подобный следующему:

<Grid Name="RootGrid" Height="50" Width="200" HorizontalAlignment="Center" VerticalAlignment="Center" Background="Green" RightTapped="RootGrid_RightTapped">
       <FlyoutBase.AttachedFlyout>
            <MenuFlyout
        x:Name="OptionsFlyout"
            Opening="MenuFlyout_Opening" 
            Opened="FolderOptionsFlyout_Opened"
            Closed="FolderOptionsFlyout_Closed">
                        <MenuFlyoutItem Name="Item1" Text="Item1"/>
                        <MenuFlyoutItem Name="Item2" Text="Item2"/>
                        <MenuFlyoutItem Name="Item3" Text="Item3"/>
                        <MenuFlyoutItem Name="Item4" Text="Item4"/>
             </MenuFlyout>
       </FlyoutBase.AttachedFlyout>
       <TextBlock Text="{x:Bind}" Height="150" Width="100"/>
</Grid>
private void RootGrid_RightTapped(System.Object sender, RightTappedRoutedEventArgs e)
{
    var fe = sender as FrameworkElement;
    var menu = Flyout.GetAttachedFlyout(fe);
    menu.ShowAt(fe);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...