2013-03-15 3 views
10

Ich habe eine einfache C# Windows 8 Grid-Anwendung erstellt.Benutzerdefinierte Detailseiten in Windows 8 Grid-Anwendung

Wenn Sie mit diesem Layout nicht vertraut sind, dann ist es eine kurze Erklärung davon hier:

Link

Was ich einfach haben möchte ist - einige benutzerdefinierte ItemDetailPages. Ich möchte in der Lage sein, einige Elemente auf der GroupDetailPage und der GroupedItemsPage klicken und navigieren Sie zu einer benutzerdefinierten .xaml Datei, eine wo ich mehr als ein Bild aufnehmen kann.

Ich bin mir sicher, dass es einen einfachen Weg gibt, den ich verpasst habe, und ich bin mir auch sicher, dass diese Information für viele Leute nützlich sein wird, also werde ich ein Kopfgeld dafür anbieten Frage.

Ich habe dies zu tun, so weit zu kämpfen:

ich eine CustomDataItem in der SampleDataSource.cs Klasse erstellt haben:

/// <summary> 
    /// Generic item data model. 
    /// </summary> 
    public class CustomDataItem : SampleDataCommon 
    { 
     public CustomDataItem(String uniqueId, String title, String subtitle, String imagePath, String description, String content, SampleDataGroup group) 
      : base(uniqueId, title, subtitle, imagePath, description) 
     { 
      this._content = content; 
      this._group = group; 
     } 

     private string _content = string.Empty; 
     public string Content 
     { 
      get { return this._content; } 
      set { this.SetProperty(ref this._content, value); } 
     } 

     private SampleDataGroup _group; 
     public SampleDataGroup Group 
     { 
      get { return this._group; } 
      set { this.SetProperty(ref this._group, value); } 
     } 
    } 

jedoch offensichtlich, indem auf die ObservableCollection

private ObservableCollection<SampleDataGroup> _allGroups = new ObservableCollection<SampleDataGroup>(); 
public ObservableCollection<SampleDataGroup> AllGroups 
{ 
    get { return this._allGroups; } 
} 

ist unmöglich mit einem anderen Datentyp. Was kann ich in diesem Fall tun?

Vielen Dank.

+0

Ich bin ein wenig verwirrt, was genau Sie hier fragen - Fragen Sie, wie die benutzerdefinierte XAML-Seite für mehrere Bilder aussehen würde, oder wie man zu einem navigieren, wenn ein Gruppenelement ausgewählt ist? –

Antwort

3

Ich habe eine einfache Grid-Anwendung; Wie mache ich es möglich, dass eines der Elemente in der Gruppenelementseite mit einer Detailseite für benutzerdefinierte Elemente verknüpft ist?

OK, nehmen wir die App, die generiert wird, wenn Sie die Vorlage "Grid App" von Visual Studio verwenden.

Die Datenklasse für die Elemente auf der Seite Gruppenelemente ist die Klasse SampleDataItem. Sie können ein Datenfeld (bool, int oder andere) hinzufügen, das angibt, wie mit der Navigation verfahren werden soll. In diesem Beispiel halten wir es einfach. Daher fügen wir eine bool hinzu, um anzugeben, ob die Navigation benutzerdefiniert ist oder nicht.

public class SampleDataItem : SampleDataCommon 
{ 
    // add flag as last param 
    public SampleDataItem(String uniqueId, String title, String subtitle, 
     String imagePath, String description, String content, SampleDataGroup group, 
     bool isCustomNav = false) 
    : base(uniqueId, title, subtitle, imagePath, description) 
    { 
     this._content = content; 
     this._group = group; 
     this.IsCustomNav = isCustomNav; 
    } 

    // to keep it simple this doesn't handle INotifyPropertyChange, 
    // as does the rest of the properties in this class. 
    public bool IsCustomNav { get; set; } 

    ... 
} 

Also, wenn Sie ein neues SampleDataItem Objekt hinzufügen angezeigt werden, müssen Sie nur das isCustomNav Feld im Konstruktor setzen.

Jetzt alles, was wir tun müssen, ist die bereits bestehenden Click-Ereignishandler im Raster auf der gruppierten Artikelseite ändern (GroupedItemsPage.xaml.cs):

void ItemView_ItemClick(object sender, ItemClickEventArgs e) 
{ 
    // Navigate to the appropriate destination page, configuring the new page 
    // by passing required information as a navigation parameter 
    var item = (SampleDataItem)e.ClickedItem; 
    var itemId = item.UniqueId; 

    if (item.IsCustomNav == false) 
    { 
     // default 
     this.Frame.Navigate(typeof(ItemDetailPage), itemId); 
    } 
    else 
    { 
     // custom page 
     this.Frame.Navigate(typeof(ItemDetailPage2), itemId); 
    } 
} 

Alles, was wir oben tun, ist die ausgewählt bekommen Element und dann das Testen der Navigationsflagge, die wir zuvor hinzugefügt haben. Basierend darauf navigieren wir entweder zum ursprünglichen ItemDetailPage oder einem neuen namens . Wie ich bereits erwähnt habe, muss das Navigationsflag kein bool sein. Es kann ein int oder enum oder ein anderer Typ sein, der uns sagt, wo man navigieren soll.

Beachten Sie, dass wenn Sie ähnliche Verhalten auf der GroupDetailsPage möchten, müssen Sie nur den Click-Ereignishandler dort auf die gleiche Weise aktualisieren.

Hoffe, dass hilft.

+0

Funktioniert perfekt :) –

+0

@chue x: Hallo, ich habe ein ähnliches Problem. Ich möchte der Gruppe Elemente unterschiedlichen Typs hinzufügen. Für Beispiel Eine Gruppe zeigt KPI, eine Gruppe zeigt Indikatoren an, aber in der Beispiel-GridApp hat die SampleDataSource.cs-Komponente nur einen Typ (SampleDataItem). Wie gehe ich vor? – Vanya

+0

@Vanya - Ich habe nicht getan, was Sie fragen. Sie sollten jedoch eine Liste verwenden, in der eine gemeinsame Basisklasse gespeichert wird. Verwenden Sie dann zur Laufzeit einen Vorlagenselektor, um Ihre Daten basierend auf dem Klassentyp anzuzeigen. Sie können eine bessere Antwort erhalten, wenn Sie eine neue Frage stellen und mehr Details bereitstellen: http://stackoverflow.com/questions/ask –

3

Ja, Sie sollten in der Lage sein, einen benutzerdefinierten oder einen anderen Datentyp zu erstellen. Wenn Sie eine Win8-Anwendung mit der Rastervorlage erstellen, sehen Sie, dass die Vorlage drei Dinge für Sie erledigt: 1) Es erstellt drei Typen, SampleDataCommon, die Basis, SampleDataItem, die SampleDataCommon implementiert und zwei neue Eigenschaften hinzufügt - Inhalt und Gruppe und SampleDataGroup, die auch SampleDataCommon implementiert, fügt eine Methode ItemsCollectionChanged hinzu und fügt zwei Eigenschaften hinzu, Items und TopItems. 2) Es erstellt eine Klasse namens SampleDataSource, in der eine Sammlung von SampleDataGroup erstellt wird und AllGroups benannt: ObservableCollection AllGroups. 3) Es bindet Items und AllGroups von SampleDataSource an Objekte in XMAL-Seiten.

In Ihrem Fall verwenden Sie die gleiche Datenstruktur. Mit anderen Worten, Sie erstellen eine Gruppe mit Elementen usw.