我目前正在开发一个聊天程序,当我显示两个人的聊天历史时,我想滚动到垂直堆栈布局的最后一条消息/末尾-->我用的是.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是否应该完全初始化?

我希望你能帮助我!

推荐答案

在我的主管的帮助下,我找到了解决这个问题的方法:

您必须启用一个计时器对象,该对象获取一个函数,该函数调用所需的函数滚动器.在主线程内滚动到同步(TextField,ScrollToPosition.End,false)(因为否则会引发异常).重要的是无限超时,因此操作只执行一次.

如果有人有同样的问题,下面是代码:

Timer timer = new Timer((object obj) => {
            MainThread.BeginInvokeOnMainThread(() => Scroller.ScrollToAsync(TextField, ScrollToPosition.End, false));
        }, null, 100, Timeout.Infinite);

100是计时器对象在执行之前等待的时间.现在真正好的事情是,用户界面不再被阻塞!

Csharp相关问答推荐

使用C#中的Shape API从Azure目录获取所有用户

System. InvalidOperationException:无法将数据库中的字符串值i转换为映射的ItemType枚举中的任何值''''

通过条件列表删除/更新EF Core 7中的实体的有效方法

如何注册接口类型,类型<>

用C#调用由缓冲区指针参数组成的C API

如何从ASP.NET核心MVC视图和Blazor传递数据

更改执行目录

Automapper 12.x将GUID映射到字符串

如何在VS代码中为C#DotNet配置.json选项以调试内部终端的控制台应用程序

DbContext-传递自定义配置选项

Polly重试URL复制值

获取混淆&Quot;模糊引用&Quot;错误

工厂类是如何在.NET 8中注册的?

Maui:更改代码中的绑定字符串不会更新UI,除非重新生成字符串(MVVM)

Xamarin Forms应用程序中登录页面的用户名和密码编辑文本之间不需要的空格

为什么INTEGER在通过反射调用时对空对象返回TRUE,而在INTEGER上调用时返回FALSE?

如何获取我在SQL中输入的值

方法加载时出现类型加载异常

如何在C#Visual Studio IF语句中删除换行符

无法使用EF核心插入已有导航属性的新实体