Динамически создавать список кнопок и передавать данные в нем?

82
11

Я новичок в С#, и я сам учу себя С#. Я пытаюсь создать мое первое приложение магазина win8 в С# XAML. Приложение будет только для моего использования и не будет опубликовано в магазине. Приложение web scrapps сайт, и он собирает некоторые ссылки из него и их описания и заполняет список. Список имеет ссылку и описание и выглядит следующим образом: ссылка: www.google.com описание: google

ссылка: www.yahoo.com описание: yahoo

Моя первая проблема заключается в том, что я не понимаю, как передать эти данные на страницу XAML. И моя другая проблема заключается в том, как создать динамический список кнопок, поэтому, если в моем списке есть 10 элементов, мне нужно 10 кнопок на странице XAML. Если в моем списке 5 элементов, я хочу 5 кнопок на странице XAML. И каждая кнопка должна иметь это содержимое, установленное для описания из моего списка. Когда я нажимаю на кнопку, я хочу передать ссылку, которая принадлежит описанию, и открыть другую страницу XAML, где я могу использовать ссылку и что-то сделать с ней.

Мой MainPage.xaml.cs выглядит так:

{
/// <summary>
/// An empty page that can be used on its own or navigated to within a Frame.
/// </summary>
public sealed partial class MainPage : Page
{
public ObservableCollection<MyApp.HtmlParser.LinkItem> LinkItems { get; set; }

public MainPage()
{

this.InitializeComponent();
}

/// <summary>
/// Invoked when this page is about to be displayed in a Frame.
/// </summary>
/// <param name="e">Event data that describes how this page was reached. The Parameter
/// property is typically used to configure the page.</param>
protected async override void OnNavigatedTo(NavigationEventArgs e)
{
HtmlParser pars = new HtmlParser();
pars.Uri = "http://some website.something/";
//LinksItems = await pars.Parse();
ObservableCollection<MyApp.HtmlParser.LinkItem> LinksItem = await pars.Parse();
ListLinks.DataContext = LinkItems;
}
}

}

Мой класс HtmlParser выглядит следующим образом:

{
class HtmlParser
{

private string sUri;

public string Uri
{
get { return this.sUri; }
set { this.sUri = value; }
}

public class LinkItem
{
public string link { get; set; }
public string description { get; set; }

public LinkItem(string Link, string Description)
{
this.link = Link;
this.description = Description;

}

}

public HtmlParser()
{
this.sUri = string.Empty;
}
public async Task<ObservableCollection<LinkItem>> Parse()

{
ObservableCollection<LinkItem> listDesc = new ObservableCollection<LinkItem>();
// Initialize http client.
HttpClient httpClient = new HttpClient();
var message = new HttpRequestMessage(HttpMethod.Get, this.sUri);
message.Headers.Add("User-Agent", "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0)");
var response = await httpClient.SendAsync(message);
var result = response.Content.ReadAsStringAsync().Result;

HtmlAgilityPack.HtmlNode.ElementsFlags.Remove("option");

HtmlDocument document = new HtmlDocument();
document.LoadHtml(result);

//pars web page
//var options = document.DocumentNode.Descendants("option").Skip(1)
// .Select(n => new
// {
// Value = n.Attributes["value"].Value,
// Text = n.InnerText
// })
// .ToList();

//pars mobile web page
var options = document.DocumentNode.Descendants("a").Skip(1)
.Select(n => new
{
Value = n.Attributes["href"].Value,
Text = n.InnerText,

})
.ToList();

foreach (var e in options)
{
// Add results to list:
listDesc.Add(new LinkItem( "http://mobile.blitz-cinestar.hr/" + e.Value, e.Text));
}
return listDesc;
}

}

}

Мой XAML выглядит так

<Page
x:Class="MyApp.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:MyApp"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d">
<ListView x:Name="ListLinks" ItemsSource="{Binding}"
HorizontalAlignment="Left" Height="495" VerticalAlignment="Top" Width="382">
</ListView>

Извините за мой плохой английский.

спросил(а) 2013-09-05T15:33:00+04:00 7 лет, 1 месяц назад
1
Решение
99

Вероятно, вы должны переименовать MyList в LinkItem, который содержит ссылку и ее описание;

Добавьте свойство типа ObservableCollection<LinkItem> и ObservableCollection<LinkItem> его (в этом примере, MyLinks имя MyLinks) Добавьте ListView в свой MainPage.xaml Установить вид списка ItemsSource свойство {Binding MyLinks}. К настоящему моменту вы должны иметь список, отображающий строку "MyAppNamespace.LinkItem" для каждого элемента Создайте ItemTemplate для каждого LinkItem, где вы показываете кнопку и устанавливаете ее свойство Content на {Binding Description} Создание обработчика события Click

Надеюсь, этого достаточно, чтобы отправить вас по правильному пути. Кроме того, вам, вероятно, следует начать с некоторых из учебников Windows 8, чтобы лучше понять некоторые из этих концепций.

редактировать

Вы не выполнили мои инструкции правильно. Попробуйте это: добавьте свойство в свой MainPage и заполните его с помощью LinkItem s:

public sealed partial class MainPage : Page
{
ObservableCollection<LinkItem> LinkItems {get; set;} // <---------

public MainPage()
{
this.InitializeComponent();
}

protected override void OnNavigatedTo(NavigationEventArgs e)
{
HtmlParser pars = new HtmlParser();
pars.Uri = "http://some website.something/";
LinksItems = await pars.Parse(); //<-------------
}
}

Сделать парсер возвратом заполненной коллекции:

public async Task<ObservableCollection<LinkItem>> Parse()
{
ObservableCollection<LinkItem> listDesc = new ObservableCollection<LinkItem>();
//...
return listDesc;
}

Измените привязку к LinkItems (название созданной вами коллекции):

<ListView x:Name="ListLinks" ItemsSource="{Binding LinkItems}"
HorizontalAlignment="Left" Height="495" VerticalAlignment="Top" Width="382">
</ListView>

ответил(а) 2013-09-05T15:42:00+04:00 7 лет, 1 месяц назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема