UWP C # Menuflyout Невозможно правильно отобразить элемент во время первого клика - PullRequest
0 голосов
/ 22 октября 2018

У меня проблема с кодом для добавления кнопки из json, когда при первой попытке нажатия add button ответ menuflyout не будет получен, но при попытке второго нажатия будет работать правильно.Могу посоветовать, я сделал что-то не так?Спасибо.

private async void AddButton_Click(object sender, RoutedEventArgs e)
{
    List<ClientList> clientLists;
    var jsonSerializer = new DataContractJsonSerializer(typeof(List<ClientList>));


    var myStream = await ApplicationData.Current.LocalFolder.OpenStreamForReadAsync(CLIENTSLIST);

    clientLists = (List<ClientList>)jsonSerializer.ReadObject(myStream);
    var menuFlyout = new MenuFlyout();

    int isEmpty = myGrid.Children.Count;
    if (isEmpty == 0)
    {
        foreach (var device in clientLists)
        {
            var menuFlyoutItem = new MenuFlyoutItem() { Name = device.clientname, Text = device.clientname };
            menuFlyoutItem.Tag = device.clientaddress;
            menuFlyoutItem.Click += AddMenuFlyoutItem_Click;
            menuFlyout.Items.Add(menuFlyoutItem);
        }
    }else
    {
        foreach (var device in clientLists)
        {
            bool toAddButton = true;
            foreach (Button btn in myGrid.Children.OfType<Button>())
            {
                if (btn.Content.ToString() == device.clientname)
                {
                    toAddButton = false;
                }
            }
            if (toAddButton)
            {
                var menuFlyoutItem = new MenuFlyoutItem() { Name = device.clientname, Text = device.clientname };
                menuFlyoutItem.Tag = device.clientaddress;
                menuFlyoutItem.Click += AddMenuFlyoutItem_Click;
                menuFlyout.Items.Add(menuFlyoutItem);
            }
        }
    }
    AddButton.Flyout = menuFlyout;
}

1 Ответ

0 голосов
/ 22 октября 2018

Проблема в том, что вы загружаете данные здесь асинхронно:

var myStream = await ApplicationData.Current.LocalFolder.OpenStreamForReadAsync(CLIENTSLIST);

Когда это происходит, пользовательский интерфейс продолжает выполнять событие Click, поэтому кнопка нажимается (и Flyout равно nullв первый раз) и Flyout никогда не будет отображаться.Вам лучше загрузить Flyout до этого - либо при загрузке страницы, либо при изменении источника данных, чтобы при щелчке пользователя всплывающее окно уже было.Выполнять загрузку в Click просто слишком поздно, если вам нужна асинхронная операция для завершения.

В качестве альтернативы вы можете установить всплывающее окно прямо в начале:

private async void AddButton_Click(object sender, RoutedEventArgs e)
{
    var menuFlyout = new MenuFlyout();
    AddButton.Flyout = menuFlyout;
    List<ClientList> clientLists;
    var jsonSerializer = new DataContractJsonSerializer(typeof(List<ClientList>));


    var myStream = await ApplicationData.Current.LocalFolder.OpenStreamForReadAsync(CLIENTSLIST);

    clientLists = (List<ClientList>)jsonSerializer.ReadObject(myStream);

    int isEmpty = myGrid.Children.Count;
    if (isEmpty == 0)
    {
        foreach (var device in clientLists)
        {
            var menuFlyoutItem = new MenuFlyoutItem() { Name = device.clientname, Text = device.clientname };
            menuFlyoutItem.Tag = device.clientaddress;
            menuFlyoutItem.Click += AddMenuFlyoutItem_Click;
            menuFlyout.Items.Add(menuFlyoutItem);
        }
    }else
    {
        foreach (var device in clientLists)
        {
            bool toAddButton = true;
            foreach (Button btn in myGrid.Children.OfType<Button>())
            {
                if (btn.Content.ToString() == device.clientname)
                {
                    toAddButton = false;
                }
            }
            if (toAddButton)
            {
                var menuFlyoutItem = new MenuFlyoutItem() { Name = device.clientname, Text = device.clientname };
                menuFlyoutItem.Tag = device.clientaddress;
                menuFlyoutItem.Click += AddMenuFlyoutItem_Click;
                menuFlyout.Items.Add(menuFlyoutItem);
            }
        }
    }
}

Таким образом,появится всплывающее окно, но оно будет пустым до тех пор, пока не закончится асинхронная загрузка и элементы не будут добавлены.Здесь вы просто читаете файл, поэтому он должен быть едва заметен.Хотя он и не такой чистый, как предварительная загрузка всплывающего окна, он также должен выполнять свою работу.

...