Если вы пропустили предыдущие две части, вы можете легко найти их здесь:
- Достижения 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. Если вас смущают фрагменты, которые я публикую, или вам лень вводить / копировать весь код самостоятельно, просто зайдите сюда, чтобы получить последний источник: