Проблема в том, что вы загружаете данные здесь асинхронно:
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);
}
}
}
}
Таким образом,появится всплывающее окно, но оно будет пустым до тех пор, пока не закончится асинхронная загрузка и элементы не будут добавлены.Здесь вы просто читаете файл, поэтому он должен быть едва заметен.Хотя он и не такой чистый, как предварительная загрузка всплывающего окна, он также должен выполнять свою работу.