滚动到Xamarin中的StackLayout中的可绑定元素

发布于 2025-02-09 02:47:14 字数 1528 浏览 1 评论 0原文

我正在使用scrollview和stacklayout在我的XAML页面上显示注释: https://pastebin.com/mutdkasj 在启用方法中,我尝试在stacklayout中找到元素并滚动到它:

public partial class TicketPage : ContentPage
    {
        public Ticket Ticket { get; private set; }
        public ObservableCollection<Comment> Comments { get; private set; }

        private string _commentId;

        public TicketPage(Ticket ticket) : base()
        {
            Ticket = ticket;
            Comments = new ObservableCollection<Comment>(Ticket.comments);
            BindingContext = this;
            InitializeComponent();
        }

        public TicketPage(Ticket ticket, string commentId) : this(ticket)
        {
            _commentId = commentId;
        }

        protected async override void OnAppearing()
        {
            base.OnAppearing();
            if (String.IsNullOrEmpty(_commentId))
                return;

            int commentIndex = -1;
            for (int i = 0; i < Comments.Count; i++)
            {
                if (Comments[i]._id == _commentId)
                {
                    commentIndex = i;
                    break;
                }
            }
            if (commentIndex == -1)
                return;

            Element element = CommentsList.Children[commentIndex];
            await Scroll.ScrollToAsync(element, ScrollToPosition.Start, true);
        }
       //...
}

但它不起作用。我在做什么错?

I am using scrollview and stacklayout to display comments on my xaml page:
https://pastebin.com/MUTdkaSj
In OnAppearing method i am try to find element in stacklayout and scroll to it:

public partial class TicketPage : ContentPage
    {
        public Ticket Ticket { get; private set; }
        public ObservableCollection<Comment> Comments { get; private set; }

        private string _commentId;

        public TicketPage(Ticket ticket) : base()
        {
            Ticket = ticket;
            Comments = new ObservableCollection<Comment>(Ticket.comments);
            BindingContext = this;
            InitializeComponent();
        }

        public TicketPage(Ticket ticket, string commentId) : this(ticket)
        {
            _commentId = commentId;
        }

        protected async override void OnAppearing()
        {
            base.OnAppearing();
            if (String.IsNullOrEmpty(_commentId))
                return;

            int commentIndex = -1;
            for (int i = 0; i < Comments.Count; i++)
            {
                if (Comments[i]._id == _commentId)
                {
                    commentIndex = i;
                    break;
                }
            }
            if (commentIndex == -1)
                return;

            Element element = CommentsList.Children[commentIndex];
            await Scroll.ScrollToAsync(element, ScrollToPosition.Start, true);
        }
       //...
}

But it's doesn't work. What am I doing wrong?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

白日梦 2025-02-16 02:47:14

也许您的评论指数保持在-1。您可以将LINQ使用。

让我举一个例子,您可以做到这一点。
要获取一个元素,而不是在列表中找到该类的索引,只需在列表中找到类,然后在元素中找到linq并检查bindingContext。

Comment bdContext = Comments.First(x => x._id == _commentId);
Element element = MainLayout.Children.First(x => x.BindingContext == bdContext);
if (element != null)
{
    await Scroll.ScrollToAsync(element, ScrollToPosition.Start, true);
}

这种类似的情况对我有用。只是一个建议,如果您没有要滚动的项目下面的任何内容,则不要使用“ scrolltoposition.start”而不是使用“ scrolltoposition.makevisible”。

Maybe your commentIndex is staying -1. You can use Linq for this.

Let me give you an example how you could do this.
To get an element, instead of finding index of that class in list just find the class in the list and then for element, use the Linq and check for the BindingContext.

Comment bdContext = Comments.First(x => x._id == _commentId);
Element element = MainLayout.Children.First(x => x.BindingContext == bdContext);
if (element != null)
{
    await Scroll.ScrollToAsync(element, ScrollToPosition.Start, true);
}

This similar case worked for me. And just a suggestion, if you don't have anything below the item you want to scroll to then don't use "ScrollToPosition.Start" instead use "ScrollToPosition.MakeVisible".

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文