Asynchronous 在Task.Delay()中向XAML页面添加元素

Asynchronous 在Task.Delay()中向XAML页面添加元素,asynchronous,xamarin.forms,task,Asynchronous,Xamarin.forms,Task,我正在构建一个聊天机器人应用程序,其中包含用于收发消息的聊天泡泡。对于传入的消息,我给了它一个Task.Delay(),现在我想在每次消息弹出之前给它一个ActivityIndicator(即,我想在消息被延迟时显示activity indicator)。我已经将活动指示器添加到传入消息控件的XAML中 IncomingMessageItemControl <ViewCell x:Class="BluePillApp.Controls.IncomingMessageItemCont

我正在构建一个聊天机器人应用程序,其中包含用于收发消息的聊天泡泡。对于传入的消息,我给了它一个
Task.Delay()
,现在我想在每次消息弹出之前给它一个
ActivityIndicator
(即,我想在消息被延迟时显示activity indicator)。我已经将活动指示器添加到传入消息控件的XAML中
IncomingMessageItemControl

<ViewCell
    x:Class="BluePillApp.Controls.IncomingMessageItemControl"
    xmlns="http://xamarin.com/schemas/2014/forms"
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
    xmlns:d="http://xamarin.com/schemas/2014/forms/design"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:pancake="clr-namespace:Xamarin.Forms.PancakeView;assembly=Xamarin.Forms.PancakeView"
    mc:Ignorable="d">


    <Grid x:Name="Gridoo">
        <pancake:PancakeView
            Margin="10,10,80,10"
            Padding="15"
            BackgroundColor="#53ffc6"
            CornerRadius="20,20,0,20"
            HasShadow="False"
            HorizontalOptions="StartAndExpand">

            <Label
                FontSize="Medium"
                Text="{Binding Text}"
                TextColor="#1a1a1a" />
        </pancake:PancakeView>

        <ActivityIndicator IsRunning="True" IsVisible="True" />
    </Grid>
</ViewCell>

问题是,在ChatbotMessagingPage中,按下send按钮,然后在收到回复/传入消息之前发送一条传出消息,我在MVVM中也是这样做的
ChatbotMessagingPageViewModel

//This gets the chatbots response for each message
            chatbot.MainUser.ResponseReceived += async (sender, args) =>
            {
                await Task.Delay(1500);
                Messages.Add(new ChatMessageModel() { Text = args.Response.Text, User = App.ChatBot });
            };
        }

        #region CLASS METHODS
        /// <summary>
        /// This function sends a message
        /// </summary>
        public void Send()
        {
            if (!string.IsNullOrEmpty(TextToSend))
            {
                var msgModel = new ChatMessageModel() { Text = TextToSend, User = App.User };

                //This adds a new message to the messages collection
                Messages.Add(msgModel);

                var result = chatbot.Evaluate(TextToSend);
                result.Invoke();

                //Removes the text in the Entry after message is sent
                TextToSend = string.Empty;
            }
        }
//这将获取每条消息的聊天机器人响应
chatbot.MainUser.ResponseReceived+=异步(发送方,参数)=>
{
等待任务。延迟(1500);
添加(新的ChatMessageModel(){Text=args.Response.Text,User=App.ChatBot});
};
}
#区域类方法
/// 
///此函数发送一条消息
/// 
公共无效发送()
{
如果(!string.IsNullOrEmpty(TextToSend))
{
var msgModel=new ChatMessageModel(){Text=TextToSend,User=App.User};
//这将向messages集合添加一条新消息
Messages.Add(msgModel);
var result=chatbot.Evaluate(TextToSend);
result.Invoke();
//在消息发送后删除条目中的文本
TextToSend=string.Empty;
}
}

每次我按下发送按钮时,ActivityIndicator会与IncomingMessage一起出现,我希望ActivityIndicator会先出现,而IncomingMessage会被延迟。

我猜查看单元格就是消息气泡

当您这样做时:

Messages.Add(new ChatMessageModel() { Text = args.Response.Text, User = App.ChatBot });
您的集合将被更新,您的ListView或任何保存这些ViewCelss的内容也将被更新。
ActivityIndicator
ViewCell
的一部分,因此它与消息同时出现

[选项1]使用附加标志

您可以创建一个标志
IsBusy
IsDelay
或其他东西,并将ActivityIndicator的可见性和标签绑定到它:



因为您已经得到了消息,所以除了消息之外,延迟没有任何意义,而是延迟元素的呈现。你可以做淡入淡出的动画——我不想再加上一条消息。每个消息在显示之前都有一个延迟,我想要的是当它被延迟时弹出一个活动指示器,然后你应该有一个不同的策略。。。将忙碌的光标放在列表的页脚,在等待消息时显示。。。简单,让我知道你是否需要帮助