В общем решил попробовать себя в этом деле, написать клиент для своего сайта в целях самообразования. Никакая монетизация не предвидится :)
Как правильно организовать «меню» — т.е. например я с сайта получаю список объектов. Потом я хочу чтобы при тапе на объект открывалась страница с описанием объекта.
Пока я сдела это так:
XAML:
<ListBox HorizontalAlignment="Left" Margin="9,0,0,0" Name="listBox1" VerticalAlignment="Top" SelectionChanged="OnChange" ItemsSource="{Binding}" SelectionMode="Single" >
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal" Margin="4">
<Image Source="{Binding Path=Logo}" Width="82" Height="62" Stretch="Fill" />
<StackPanel Margin="4,0,0,0">
<TextBlock Text="{Binding Path=Name}" TextWrapping="Wrap" TextTrimming="WordEllipsis" />
<StackPanel Orientation="Horizontal">
<TextBlock Text="Инвестиции от " TextWrapping="Wrap" />
<TextBlock Text="{Binding Path=Invest}" TextWrapping="Wrap" />
<TextBlock Text=" руб." TextWrapping="Wrap" />
</StackPanel>
</StackPanel>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
С#:
var searchResults = from result in resultXml.Descendants("fr")
select new FranchiseOnMain
{
// Get the Title, Description and Url values.
Logo = result.Element("logo").Value,
Name = result.Element("name").Value,
Id = result.Element("id").Value,
Invest = result.Element("invest").Value
};
listBox1.DataContext = searchResults;
Т.е. есть листбокс в который я гружу данные, полученные от сервера в формате xml.
Теперь мне надо чтобы по тапу на элемент листбокса открывалась другая страница с расширенным описанием этого объекта.
Я сделал это так:
private void OnChange(object sender, SelectionChangedEventArgs e)
{
if (listBox1.SelectedItem != null)
{
TextBlock textblock1 = new TextBlock();
FranchiseOnMain fr = (FranchiseOnMain)listBox1.SelectedItem;
string uri = "/FranchisePage.xaml?id=" + fr.Id + "&name=" + fr.Name;
NavigationService.Navigate(new Uri(uri, UriKind.RelativeOrAbsolute));
listBox1.SelectedItem = null;
}
}
Т.е. после выбора объекта я открываю используя navigation service другую страницу с параметром, и обнуляю выбор, чтобы когда я вернусь обратно на главную — в листбоксе ничего не было выбрано.
Если выбор не обнулять то потом возникает проблема что вернувшись в список объектов я не могу снова попасть на тот же самый потому что он уже выбран в листбоксе и SelectionChanged не срабатывает.
Но мне не нравится такое решение, я хочу сделать нормально. Как это сделать правильно? Нужно использовать не листбокс а какой то другой контрол? Бывают ли другие контролы, которые умеют автоматически подгружать коллекцию объектов или надо будет вручную это делать? В принципе вручную сделать не проблема если подскажете какой ставить контрол для перехода между страницами (с нормально анимацией нажатия).