Вопрос

Быть новым в 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");
            }
        }
    }
}
.

Спасибо еще раз, чтобы помочь!

Это было полезно?

Решение

Как вы говорите, вы все еще изучаете, позвольте мне объяснить, почему имея количество элементов поворота - плохое представление:

  1. Вы, скорее всего, будут работать в выпуски производительности из-за объема контента на одной странице. С помощью списка предметы могут быть виртуализированы. Контроль поворота не поддерживает виртуализацию динамически добавленных пивотирем.

  2. Для людей трудно перейти к желаемому элементу, когда есть много пивотителей, так как нет способа быстро добраться до того, что он хотел. Скажем, у вас было 30 предметов в повороте, но хотелось добраться до 15-го. Это потребует много прослушивания, и если бы это быстро, было бы легко пройти мимо того, что было разыскивается.

  3. Управление поворотом предназначено для использования для одной из двух целей:

    1. Чтобы показать разные виды на набор данных. I.e. Приложение электронной почты показывает разные виды почтового ящика в каждом пивотитре, фильтруют для «все», «непрочитанные», «помещены» и «срочно».

    2. , чтобы показать различные части связанных данных. I.

      Это не намерение, чтобы контроль поворота должен использоваться в качестве контейнера для огромных количеств содержания, таких как N коллекции списков шаблонов.

      Предполагается, что максимальное количество предметов в повороте должно быть 7, чтобы избежать проблем с производительностью и удобством использования.

      Все во всем, не используя элемент управления поворотом в одном из способов предполагаться, может вызвать проблемы с производительностью для вас в качестве проблем разработчиков и удобств для людей, использующих приложение.
      Оба из которых являются сценариями, которые следует избегать.

      Извините, это не прямой ответ на ваш вопрос, но, надеюсь, это поможет вам разработать лучшее приложение (или приложения). ;)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top