Domanda

Essere nuovi allo sviluppo del telefono di Windows 7/8 Arena ... Mi sto divertendo a lavorare con il telefono Windows e tremendamente ... Tuttavia c'è stata una curva di apprendimento e così tanto da conoscere.

Con questo detto, quello che sto cercando di fare è creare una pagina che è dinamicamente legata a una struttura dati che visualizzerà N numero di pagine di perno e ogni pagina di pivot avrà uno XAML diverso per visualizzare il contenuto. .

Ho guardato oltre questo articolo del progetto articolo ( http://www.codeproject.com/articles/113152/Applying-Data-Templates-dynamicy-by-type-in-WP7 ) e utilizza una casella di riepilogo per controllare il display ... ma Quello che mi interessa sta facendo la stessa cosa, ma con una pagina di pivot.

Io apprendo il meglio per esempio ... Ecco le classi per vincolare i dati ai controlli, che vorrei usare ...

  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; }
  }
.

Non so se sarebbe meglio pubblicare tutto il codice qui ... o solo per dare un'occhiata a tutti gli articoli sul progetto di codice, posterò il codice che ho modificato dall'articolo .. . Nella speranza che qualcuno possa aiutarmi a capire questo:

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>
.

Ecco la classe DataTempLateSelector

public static class DataTemplateSelector
{

    public static DataTemplate GetTemplate(ViewModelBase param)
    {
        Type t = param.GetType();
        return App.Current.Resources[t.Name] as DataTemplate;
    }
}
.

Ecco il controllo dinamico dei contenuti: Classe pubblica DynamicContentControl: ContentControl { Override protetto Void oncontentChanged (Object OldContent, Object Newcontent) { base.oncontentchanged (oldcontent, newcontent); This.ContentTemplate= msator.model.datemplateselector.getTemplate (newcontent come viewModelbase); }
. }

Ecco la prima vista XAML:

<Grid x:Name="LayoutRoot" Background="{StaticResource PhoneChromeBrush}">
    <TextBlock Margin="20" Foreground="Green" FontSize="32"
           FontWeight="Bold" Text="{Binding Path=FirstProperty}"
           ></TextBlock>
</Grid>
.

(la seconda vista XAML può essere la prima vista, basta cambiare il colore)

Ecco la Classe FirstViewModel (dall'articolo)

    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");
            }
        }
    }

}
.

Ecco la classe del modello selezionabile

 public class SelectableViewModel : ViewModelBase
 {
    public SelectableViewModel()
    {
    }

    string dispName;
    public string DisplayName
    {
        get { return dispName; }

        set
        {
            if (dispName != value)
            {
                dispName = value;
                RaisePropertyChanged("DisplayName");
            }
        }
    }
}
.

Ecco la classe del modello di vista principale:

    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");
            }
        }
    }
}
.

Grazie ancora per aiutare!

È stato utile?

Soluzione

Come dici tu stai ancora imparando, lasciami spiegare perché avere n numero di oggetti per pivot è una cattiva idea:

    .
  1. Probabilmente entrerà nei problemi di prestazione a causa della quantità di contenuti su una singola pagina. Con una lista gli articoli possono essere virtualizzati. Il controllo del pivot non supporta la virtualizzazione dei pivitems aggiunti dinamicamente.

  2. È difficile per le persone navigare verso l'oggetto desiderato quando ci sono molti pivititi che non c'è un modo per arrivare rapidamente a quello che è ricercato. Dì che hai avuto 30 oggetti nel perno ma volevi raggiungere il 15 °. Ciò richiederebbe molto swiping e se lo facesse rapidamente sarebbe facile andare oltre quello che era ricercato.

  3. Il controllo del pivot è destinato a essere utilizzato per uno dei due scopi:

      .
    1. per mostrare diverse opinioni di un insieme di dati. I.e. L'app e-mail mostra diverse viste di una cassetta postale in ogni pivotitem, filtrato per "tutto", "non letto", "contrassegnato" e "urgente".

    2. per mostrare diversi pezzi di dati correlati. I.e. Quando si visualizza un singolo contatto / persona vedi diverse azioni e informazioni correlate raggruppate nei diversi pivitems: "Profili", "Cosa c'è di nuovo", "Foto" e "Storia".

    3. Non è l'intenzione che il controllo del pivot sia usato come contenitore per vaste quantità di contenuti, come n collezioni di elenchi di modelli.

      Si suggerisce che il numero massimo di elementi in un pivot dovrebbe essere 7 per evitare problemi con prestazioni e usabilità.

      Tutto sommato, non usare il controllo del pivot in uno dei modi in cui è stato inteso può causare problemi di prestazione per te come problemi di sviluppatore e usabilità per le persone che utilizzano l'app.
      Entrambi i quali sono gli scenari da evitare.

      Scusa questa non è una risposta diretta alla tua domanda ma spero che ti aiuterà a sviluppare un'app (o app) migliore. ;)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top