UWP C# Menuflyout 无法在第一次单击期间正确显示项目

UWP C# Menuflyout Unable To Display Item Properly During 1st Click

我在从 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;
}

问题是您在此处异步加载数据:

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

发生这种情况时,UI 继续执行 Click 事件,因此按钮被单击(Flyoutnull 第一次)并且 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);
            }
        }
    }
}

这样,弹出窗口将出现,但在异步加载完成并实际添加项目之前将为空。这里你只是在读取一个文件,所以它应该几乎不会被注意到。虽然不如预加载弹出窗口那么干净,但它也应该完成工作。