我目前正在开发一个聊天程序,当我显示两个人的聊天历史记录时,我希望滚动到最后一条消息/垂直堆栈布局的结尾--> 我使用.ScrollToAsync函数来完成这个操作。
如果我点击其中一个用户按钮,那么历史记录将从本地存储方法中加载。然后程序为每条消息创建一个标签,并将其添加到可滚动的垂直堆栈布局中。之后它应该滚动到垂直堆栈布局的末尾。使用以下代码片段:
await Scroller.ScrollToAsync(TextField, ScrollToPosition.End, false);
完整的方法在这里:
private async void OnCounterClicked(object sender, EventArgs e)
{
if (m_currentLabels != null)
{
foreach(Label label in m_currentLabels)
{
TextField.Remove(label);
}
}
m_currentLabels = new List<Label>();
Button button =(Button) sender;
string str = button.Text;
Guid userId = m_userDictionary[str];
List<Guid> guids = new List<Guid>();
guids.Add(userId);
m_currChannelPartners = guids;
List<MessageModel> localMessages = m_eChatBusiness.GetMessages(MessageModel.Yourself.ID, guids);
foreach(MessageModel message in localMessages)
{
Label messageLabel = new Label();
messageLabel.Text = $"{message.Created} {message.Message} | {GetStatus(message)}";
messageLabel.TextColor = Color.Parse("White");
messageLabel.HorizontalTextAlignment = message.Position == "End"? TextAlignment.End:TextAlignment.Start;
m_currentLabels.Add(messageLabel);
TextField.Add(messageLabel);
}
await Scroller.ScrollToAsync(TextField, ScrollToPosition.End, false);
}
Scroller是ScrollView,TextField是垂直堆叠布局。
奇怪的事情是:当我第二次点击按钮时它就起作用了。我试着猜测,但由于我在方法的结尾调用异步函数,TextField应该已经完全初始化了吧?
希望你能帮助我!