TL; DR: Я хочу:Реализация отложенной загрузки иерархического StackLayout в Xamarin форм
- Сохранить некоторые C# объект в каждом StackLayout
- Использование информации из этого объекта, чтобы сделать еще StackLayouts, если пользователь хочет Это.
Детали:
Я хочу, чтобы отобразить все HTML DOM дерево объектов некоторых веб-сайта в виде списка.
Я использую Html Agility Pack для управления загруженным html. Он создает объекты списка HtmlNode, у которых есть некоторые HtmlNodes как дети, у которых есть некоторые HtmlNodes как дети и т. Д. (Как и в HTML DOM).
Это то, что я в настоящее время:
private StackLayout GenerateTreeOfHtmlObjects(HtmlNode htmlNode, int padding)
{
StackLayout stackLayout = new StackLayout();
stackLayout.Orientation = StackOrientation.Vertical;
foreach (var childNode in htmlNode.ChildNodes)
{
if (childNode.Name != "#text")
{
Button showMoreButton = new Button { Text = ">", HorizontalOptions = LayoutOptions.Start, };
stackLayout.Children.Add(
new StackLayout
{
Children = {
showMoreButton,
new Label { Text = childNode.Name, FontSize=20 },
new Label { Text = new string(childNode.InnerText.Trim().ToCharArray().Take(30).ToArray()), FontSize=15 },
new Button { Text = "Zaznacz" },
GenerateTreeOfHtmlObjects(childNode, padding+10) //RECURSION, CALL THIS FUNCTION AGAIN AS LONG AS THERE ARE SOME CHILDREN
},
Padding = new Thickness(padding, 0, 0, 10)
}
);
}
}
return stackLayout;
}
Как вы видите, я создаю StackLayout для каждого HtmlNode и добавить еще StackLayouts для своих детей. Он работает более или менее, как я хотел, но проблема в занимает слишком много памяти и занимает очень много времени, чтобы загрузить.
Так что я хочу, чтобы загрузил детей из некоторых HtmlNode, только если пользователь нажмет на их родителей. Я загружу только те HtmlNodes, которые находятся на вершине дерева и будут последовательно загружать своих детей, если они понадобятся.
Для этого Мне нужно хранить где-нибудь в каждой StackLayout информацию о том, что загрузить, если пользователь нажмет на нее. Каждый загруженный StackLayout должен иметь назначенный класс HtmlNode, который позволит мне загружать дочерние элементы HtmlNode (каждый HtmlNode имеет переменную ChildNodes, и я буду получать информацию оттуда)
Вы можете создать собственный файл stacklayout с определенными атрибутами (например, classname), а затем использовать значения ваших атрибутов, чтобы определить, в какой из них находится stacklayout. –
Используйте шаблон MVVM. Затем у вас будет ViewModel, который содержит всю информацию о представлении. см: https: //developer.xamarin.com/guides/xamarin-forms/user-interface/xaml-basics/data_bindings_to_mvvm/ –