Если вы пропустили предыдущие две части, вы можете легко найти их здесь:
- Достижения Visual Studio для Windows Phone — разработка ядра
- Достижения Visual Studio для Windows Phone — как это выглядит
Сегодня я покажу вам, как можно просмотреть конкретные сведения о Niner, учитывая, что этот пользователь добавлен в «список наблюдения». Во-первых, вам нужно установить структуру главной страницы. Нечто похожее на это:
Ничего особо сложного, поэтому я собрал этот XAML для UserDetail.xaml — это страница, на которой будет отображаться информация о пользователе.
<phone:PhoneApplicationPage x:Class="VisualStudioAchievements.UserDetail" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone" xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" FontFamily="{StaticResource PhoneFontFamilyNormal}" FontSize="{StaticResource PhoneFontSizeNormal}" Foreground="{StaticResource PhoneForegroundBrush}" SupportedOrientations="Portrait" Orientation="Portrait" mc:Ignorable="d" d:DesignHeight="768" d:DesignWidth="480" shell:SystemTray.IsVisible="True" xmlns:local="clr-namespace:VisualStudioAchievements"> <phone:PhoneApplicationPage.Resources> <local:BindingPoint x:Key="LocalBindingPoint"></local:BindingPoint> </phone:PhoneApplicationPage.Resources> <Grid DataContext="{Binding Path=CurrentNiner,Source={StaticResource LocalBindingPoint}}" x:Name="LayoutRoot" Background="White"> <Grid.RowDefinitions> <RowDefinition Height="200"></RowDefinition> <RowDefinition Height="*"></RowDefinition> </Grid.RowDefinitions> <StackPanel Orientation="Horizontal"> <Image Height="200" Width="200" Source="{Binding Avatar}"></Image> <StackPanel> <TextBlock Foreground="Black" Text="{Binding Alias}" FontFamily="{StaticResource PhoneFontFamilySemiLight}" FontSize="{StaticResource PhoneFontSizeLarge}" TextWrapping="Wrap"></TextBlock> <TextBlock Foreground="Gray" Text="{Binding Name}" FontFamily="{StaticResource PhoneFontFamilySemiLight}" FontSize="{StaticResource PhoneFontSizeLarge}" TextWrapping="Wrap"></TextBlock> <TextBlock Foreground="Gray" Text="{Binding Caption}" FontFamily="{StaticResource PhoneFontFamilySemiLight}" FontSize="{StaticResource PhoneFontSizeLarge}" TextWrapping="Wrap"></TextBlock> <TextBlock Foreground="Gray" Text="{Binding Points}" FontFamily="{StaticResource PhoneFontFamilySemiLight}" FontSize="{StaticResource PhoneFontSizeLarge}" TextWrapping="Wrap"></TextBlock> </StackPanel> </StackPanel> <ListBox Grid.Row="1" ItemsSource="{Binding Achievements}"> <ListBox.ItemTemplate> <DataTemplate> <StackPanel Height="140" Orientation="Horizontal"> <Image Height="64" Width="64" Source="{Binding Icon}"></Image> <StackPanel> <TextBlock Text="{Binding FriendlyName}" Foreground="Gray"></TextBlock> <TextBlock Text="{Binding Description}" Foreground="Gray"></TextBlock> <TextBlock Text="{Binding DateEarned}" Foreground="Gray"></TextBlock> <TextBlock Text="{Binding Points}" Foreground="Gray"></TextBlock> </StackPanel> </StackPanel> </DataTemplate> </ListBox.ItemTemplate> </ListBox> </Grid> </phone:PhoneApplicationPage>
Давайте проясним части этой страницы, и я собираюсь начать с объявлений пространства имен в заголовке. Есть ссылка на xmlns: local :
xmlns:local="clr-namespace:VisualStudioAchievements"
Эта ссылка на пространство имен указывает на корень проекта — основное пространство имен. Я использую его для доступа к классу BindingPoint — это показано в разделе ресурсов страницы:
<phone:PhoneApplicationPage.Resources> <local:BindingPoint x:Key="LocalBindingPoint"></local:BindingPoint> </phone:PhoneApplicationPage.Resources>
Как быстрое напоминание, это класс для глобальных связывающих элементов, таких как коллекция Niners (пользователи 9-го канала) и текущий выбранный Niner. Говоря о том, что теперь он представлен назначенным свойством:
using System; using System.Collections.ObjectModel; namespace VisualStudioAchievements { public class BindingPoint { public static ObservableCollection<Niner> Niners { get; set; } public static Niner CurrentNiner { get; set; } } }
Вернувшись к теме главной страницы, вы, вероятно, заметили, что в основной сетке установлен набор DataContext. Таким образом, я проверяю , что все элементы внутри него получат доступ к данным через связанные свойства относительно свойства CurrentNiner .
Остальное в основном макет — Сетка разбита на два ряда. Первый — это заголовок, который отображает метаданные пользователя. ListBox во втором ряду отображаются все достижения , которые были заработаны пользователем. DataTemplate установлен соответствующим образом , так что я могу показать довольно много всю информацию достижения, как изображения, количество точек добавляется для зарабатывания его, его описания и понятного имени.
Возникает вопрос — как именно установить CurrentNiner ? Когда добавляется новый Niner, он отображается на главной странице:
Когда пользователь приложения решает нажать на один из Niners, страница должна переключиться на подробный вид. Вот почему я реализовал две вещи в ListBox, который показывает все зарегистрированные Niners:
- Привязка свойства Tag из StackPanel в DataTemplate к псевдониму пользователя
- Обработка обработчика событий Tap для StackPanel в DataTemplate
Посмотрите на его объявление:
<ListBox.ItemTemplate> <DataTemplate> <StackPanel Tap="StackPanel_Tap" Tag="{Binding Alias}" Orientation="Horizontal" Height="200">
Сам обработчик событий не содержит ничего особенного, кроме кода выбора и навигации:
private void StackPanel_Tap(object sender, GestureEventArgs e) { BindingPoint.CurrentNiner = (from c in BindingPoint.Niners where c.Alias == ((StackPanel)sender).Tag select c).Single(); NavigationService.Navigate(new Uri("/UserDetail.xaml", UriKind.Relative)); }
Это выглядит некрасиво в этот момент? Да, но так как мы сейчас фокусируемся на функциональности, то, что она работает, является наиболее важным. Теперь вы можете перемещаться назад и вперед между главной и подробной страницами, чтобы просматривать информацию о пользователе и описания достижений.
Страница проекта! Теперь вы можете получить достижения Visual Studio для Windows Phone непосредственно из CodePlex. Если вас смущают фрагменты, которые я публикую, или вам лень вводить / копировать весь код самостоятельно, просто зайдите сюда, чтобы получить последний источник: