2017-12-28 10 views
1

Ich habe eine Pivot, wo ich die Überschrift in meinem Pivot.HeaderTemplate setzen, es ist im Grunde nur Names von Books. In meinem Pivot.ItemTemplate möchte ich einen Grid zeigen, der in meinem .xaml.cs gebaut wird, aber seit dem Grid ist in meinem DataTemplate kann ich auf den Grid x:Name nicht mehr im Code hinter in .xaml.cs zugreifen. books ist eine Sammlung von Büchern, die eine Name und TitleUWP Grid in Datatemplate

MainPage.xaml

<Pivot ItemsSource="{x:Bind books}"> 

<Pivot.HeaderTemplate> 
    <DataTemplate x:DataType="local:Book"> 
     <TextBlock Text="{x:Bind Name}"/> 
    </DataTemplate> 
</Pivot.HeaderTemplate> 

<Pivot.ItemTemplate> 
    <DataTemplate> 
     <Grid 
      x:Name="BooksGrid" 
      BorderBrush="Black" BorderThickness="1 1 0 0" 
      Margin="0 10 0 0> 
     </Grid> 
    </DataTemplate> 
</Pivot.ItemTemplate> 

Jetzt habe ich zu den acces wollen BooksGrid Iny der Code hinter und erstellen Sie tatsächlich die Grid

enthält MainPage.xaml.cs

public MainPage() 
    { 

     this.InitializeComponent(); 
    } 

private void DrawGrid() 
    { 

      //create columns of Grid 
      for (int i = 0; i < booksize.XProperties.Count + 1; i++) 
      { 
       BooksGrid.ColumnDefinitions.Add(new ColumnDefinition 
       { 

       }); 

      } 

      BooksGrid.ColumnDefinitions[0].Width = GridLength.Auto; 
     } 

    .... 

Bereits hier bei BooksGrid.ColumnDefinitions.Add(...) bekomme ich den Fehler, dass BooksGrid nicht gefunden werden kann. Meine DrawGrid funktioniert, wenn ich die Grid Definition in meinem DataTemplate und auch außerhalb meiner Pivot nicht platzieren. So ist die MainPage.xaml.cs findet es nicht, wenn die Grid innen ist mein DataTemplate

ich gelesen habe, dass die Lösung könnte sein, dass ich die Grid instance zu den acces, die ich mit arbeiten wollen, sobald die DataTemplate geladen wird. Aber ich weiß auch nicht, wie ich das machen soll.

Editierteil zur ersten Lösung:

Ich bin auch in einem anderen Verfahren unter Verwendung von BooksGrid MainPage.xaml.cs

private void DrawBooksFront(Front front) 
    { 
     int row; 
     int column; 
     column = booksize.XProperties.IndexOf(front.CustomProps[booksize.XLabel])+1; 
     row = booksize.YProperties.IndexOf(front.CustomProps[booksize.YLabel])+1; 
     Frame newFrame = new Frame(); 
     TaskBoardGrid.Children.Add(newFrame); 
     Grid.SetColumn(newFrame, column); 
     Grid.SetRow(newFrame, row); 


    } 
+0

Sie sollten nicht die DateTemplate finden und Sie sollten verwenden Usercontrol – lindexi

Antwort

3

Der Grund, warum Sie keinen Zugriff auf Ihre BooksGrid ist, weil es dynamisch generiert werden für jedes Buch in der books Sammlung. Für jedes Buch wird also eine Grid generiert.

OPTION 1: können Sie fügen ein Loaded Termin in Ihrem Raster:

<Pivot x:Name="Pivot" ItemsSource="{x:Bind books}"> 
    <Pivot.HeaderTemplate> 
     <DataTemplate x:DataType="local:Book"> 
      <TextBlock Text="{x:Bind Name}"/> 
     </DataTemplate> 
    </Pivot.HeaderTemplate> 

    <Pivot.ItemTemplate> 
     <DataTemplate> 
      <Grid 
       BorderBrush="Black" BorderThickness="1,1,0,0" 
       Margin="0,10,0,0" Loaded="DrawGrid"> 
      </Grid> 
     </DataTemplate> 
    </Pivot.ItemTemplate> 

und im Code hinter:

private void DrawGrid(object sender, RoutedEventArgs e) 
    { 
     Grid grid = sender as Grid; 
     // Load your grid.. 
    } 

EDIT - OPTION 2: Wenn Sie Möchten Sie auf andere Art und Weise auf Ihre Gitter zugreifen (wie in Ihrer Bearbeitung vorgeschlagen), können Sie immer Folgendes tun:

private void DrawBooksFront(Front front) 
{ 
     // Loop through the pivot's items and get the content from each item's ContentTemplate. 
     foreach (var item in Pivot.Items) 
     { 
      PivotItem pivotItem = Pivot.ContainerFromItem(item) as PivotItem; 
      Grid grid = pivotItem.ContentTemplate.LoadContent() as Grid; 
      // Do something with the grid. 
     } 
} 
+0

Es macht Sinn für mich, aber ich bin auch mit 'BooksGrid' in einem anderen Verfahren, das' public void DrawBooksFront (Front Front) genannt wird '. Dort benutze ich es wie 'BooksGrid.Children.Add (newFrame)', um einfach einen 'Frame' hinzuzufügen –

+0

Ich editierte meinen ursprünglichen Beitrag für das –

+0

@ J.Carden, editierte ich meine Antwort. Ich hoffe, dass dir das hilft. :) – Bart

1

Wenn Ihr Ziel ist in einem gitterartig [Bild unten] in einem PivotItem Vorschauen der Seiten des Buchs angezeigt wird, dann sind Sie besser dran GridView in einem DataTemplate von Pivot.ItemTemplate platzieren und Daten unter Verwendung von Wenn Sie diese Seiten automatisch anzeigen möchten, müssen Sie den Code, den Sie angezeigt haben, nicht mehr in xaml.cs schreiben.

Bitte teilen Sie mehr Details über Ihre App (was Sie bekommen haben und wie das Endergebnis aussehen sollte), damit wir Ihnen besser helfen können.

enter image description here

Verwandte Themen