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