Динамические страницы с использованием Pivot Control
-
20-12-2019 - |
Вопрос
Быть новым в Arena для разработки телефона Windows 7/8 ... Я наслаждаюсь работой с Windows Thelp Thelp ... однако там была кривая обучения и так много, чтобы узнать.
С помощью этого сказано, что я пытаюсь сделать, это создать страницу, которая динамически связана с структурой данных, которая будет отображать число страниц Pivot, и каждая страница с поворотом будет иметь разные XAML для отображения содержимого. .
Я посмотрел на этот код проекта ( http://www.codeproject.com/articles/113152/applying-data-templates-dynamies-by-type-in-wp7 ) и использует окно списка для управления дисплеем ... но Что меня интересует, делает то же самое, но с поворотной страницей.
Я учусь лучше всего ... вот классы для привязки данных к элементам управления, которые я хотел бы использовать ...
public class ParkingLot : List<Car>
{
public ParkingLot() { }
// this will be the pivot page title
public string Lot { get; set; }
// the list of cars will be displayed on the page
}
public class Car
{
public Car() { }
// this will be the data that is displayed in the pivot page for each car
public string Width { get; set; }
public string Length { get; set; }
}
public class Library : List<Book>
{
public Library() { }
// this will be the pivot page title
public string Location { get; set; }
// the list of books will be displayed on the page
}
public class Book
{
public Book() { }
// this is the data that will be displayed for each book
public string ISBN { get; set; }
public string Title { get; set; }
}
.
Я не знаю, будет ли лучше опубликовать весь код здесь ... или просто чтобы вы все посмотрели на статью в проекте кода, я опубликую код, который я изменил из статьи .. , Надеюсь, что кто-то может помочь мне понять это:
Xaml:
<phone:PhoneApplicationPage x:Class="dynDataTemplateTest.MainPage"
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"
xmlns:loc="clr-namespace:dynDataTemplateTest.View"
xmlns:controls="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone.Controls"
FontFamily="{StaticResource PhoneFontFamilyNormal}"
FontSize="{StaticResource PhoneFontSizeNormal}"
Foreground="{StaticResource PhoneForegroundBrush}"
SupportedOrientations="Portrait"
Orientation="Portrait"
mc:Ignorable="d"
d:DesignWidth="480"
d:DesignHeight="768"
shell:SystemTray.IsVisible="True"
DataContext="{Binding Main, Source={StaticResource Locator}}">
<!--LayoutRoot contains the root grid where all other page content is placed-->
<Grid x:Name="LayoutRoot"
Background="Transparent">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<!--TitlePanel contains the name of the application and page title-->
<StackPanel x:Name="TitlePanel"
Grid.Row="0"
Margin="24,24,0,12">
<TextBlock x:Name="ApplicationTitle"
Text="{Binding ApplicationTitle}"
Style="{StaticResource PhoneTextNormalStyle}" />
<TextBlock x:Name="PageTitle"
Text="{Binding PageName}"
Margin="-3,-8,0,0"
Style="{StaticResource PhoneTextTitle1Style}" />
</StackPanel>
<!--ContentPanel - place additional content here-->
<Grid x:Name="ContentGrid"
Grid.Row="1">
<Grid.RowDefinitions>
<RowDefinition Height="*" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<loc:DynamicContentControl Content="{Binding SelectedItem}"
HorizontalContentAlignment="Stretch"
VerticalContentAlignment="Stretch" />
<controls:Pivot ItemsSource="{Binding Path=Items}" SelectedItem="{Binding Path=SelectedItem}" >
<controls:Pivot.HeaderTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path=DisplayName}" FontSize="30" FontWeight="Bold" Margin="5"/>
</DataTemplate>
</controls:Pivot.HeaderTemplate>
<controls:Pivot.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center"></StackPanel>
</ItemsPanelTemplate>
</controls:Pivot.ItemsPanel>
</controls:Pivot>
</Grid>
</Grid>
.
Вот класс DataTemplateSeLector
public static class DataTemplateSelector
{
public static DataTemplate GetTemplate(ViewModelBase param)
{
Type t = param.GetType();
return App.Current.Resources[t.Name] as DataTemplate;
}
}
.
Вот динамический контроль контента:
Открытый класс DynamicContentControl: ContentControl
{
Охраняемое переопределение пустоты OnContentChanged (объект Oldcontent, объект Newcontent)
{
base.oncontentChanged (Oldcontent, Newcontent);
this.contentTemplate= MSATOR.Model.dataTemplateSelector.gettemplate (newcontent as viewModelbase);
}
}
Вот первый просмотр XAML:
<Grid x:Name="LayoutRoot" Background="{StaticResource PhoneChromeBrush}">
<TextBlock Margin="20" Foreground="Green" FontSize="32"
FontWeight="Bold" Text="{Binding Path=FirstProperty}"
></TextBlock>
</Grid>
.
(второй вид XAML может быть первым представлением, просто измените цвет)
Вот класс FirstViewModel (из статьи)
public class FirstViewModel : SelectableViewModel
{
public FirstViewModel()
{
DisplayName = "First";
FirstProperty = "this is the first property";
}
private string firstProp;
public string FirstProperty
{
get { return firstProp; }
set
{
if (firstProp != value)
{
firstProp = value;
RaisePropertyChanged("FirstProperty");
}
}
}
}
.
Вот класс Model SelectableView
public class SelectableViewModel : ViewModelBase
{
public SelectableViewModel()
{
}
string dispName;
public string DisplayName
{
get { return dispName; }
set
{
if (dispName != value)
{
dispName = value;
RaisePropertyChanged("DisplayName");
}
}
}
}
.
Вот главный класс модели вида:
public class MainViewModel : ViewModelBase
{
public string ApplicationTitle
{
get
{
return "Dynamic Data Templates";
}
}
public string PageName
{
get
{
return "Main page";
}
}
private List<SelectableViewModel> viewModels;
public MainViewModel()
{
viewModels = new List<SelectableViewModel>();
viewModels.Add(new FirstViewModel());
viewModels.Add(new SecondViewModel());
SelectedItem = viewModels[0];
}
public List<SelectableViewModel> Items
{
get
{
return viewModels;
}
}
SelectableViewModel selItem;
public SelectableViewModel SelectedItem
{
get { return selItem; }
set
{
if (selItem != value)
{
selItem = value;
RaisePropertyChanged("SelectedItem");
}
}
}
}
.
Спасибо еще раз, чтобы помочь!
Решение
Как вы говорите, вы все еще изучаете, позвольте мне объяснить, почему имея количество элементов поворота - плохое представление:
-
Вы, скорее всего, будут работать в выпуски производительности из-за объема контента на одной странице. С помощью списка предметы могут быть виртуализированы. Контроль поворота не поддерживает виртуализацию динамически добавленных пивотирем.
-
Для людей трудно перейти к желаемому элементу, когда есть много пивотителей, так как нет способа быстро добраться до того, что он хотел. Скажем, у вас было 30 предметов в повороте, но хотелось добраться до 15-го. Это потребует много прослушивания, и если бы это быстро, было бы легко пройти мимо того, что было разыскивается.
-
Чтобы показать разные виды на набор данных. I.e. Приложение электронной почты показывает разные виды почтового ящика в каждом пивотитре, фильтруют для «все», «непрочитанные», «помещены» и «срочно».
-
, чтобы показать различные части связанных данных. I.
Это не намерение, чтобы контроль поворота должен использоваться в качестве контейнера для огромных количеств содержания, таких как N коллекции списков шаблонов.
Предполагается, что максимальное количество предметов в повороте должно быть 7, чтобы избежать проблем с производительностью и удобством использования.Все во всем, не используя элемент управления поворотом в одном из способов предполагаться, может вызвать проблемы с производительностью для вас в качестве проблем разработчиков и удобств для людей, использующих приложение.
Оба из которых являются сценариями, которые следует избегать.Извините, это не прямой ответ на ваш вопрос, но, надеюсь, это поможет вам разработать лучшее приложение (или приложения). ;)
Управление поворотом предназначено для использования для одной из двух целей: