2016-08-08 36 views
3

Ich habe den folgenden Code:Wie erhalten Sie Steuerelemente in Pivot.ItemTemplate in Pivot in UWP?

<ScrollViewer x:Name="swipeBetweenPages" Grid.Row="1"> 
        <Pivot DataContext="{StaticResource ViewModel}" x:Name="pivot" Margin="0,-45,0,0" 
            HeaderTemplate="{StaticResource headerTest}" 
          ItemTemplate="{StaticResource pivotTemplate}" ItemsSource="{Binding Articles}" SelectionChanged="pivot_SelectionChanged"> 
        </Pivot> 
       </ScrollViewer> 

<Page.Resources> 
     <ViewModels:ArticleViewModel x:Key="ViewModel" /> 
     <DataTemplate x:Key="headerTest"> 
     </DataTemplate> 
     <DataTemplate x:Key="pivotTemplate"> 
      <StackPanel Margin="-15 0 -15 0"> 
       <Grid> 
        <Grid.Background> 
         <ImageBrush AlignmentX="Center" AlignmentY="Center" ImageSource="Assets/PlaceHolder.jpg"></ImageBrush> 
        </Grid.Background> 
        <Image q42controls:ImageExtensions.CacheUri="{Binding ImageURL}" Tag="{Binding ImageURL}" Tapped="ImageView"></Image> 
       </Grid> 
       <StackPanel Background="White"> 
        <TextBlock x:Name="HeadLine" Text="{Binding HeadLine}" 
               Margin="10 5 0 -5" TextWrapping="Wrap" 
               FontSize="20" Foreground="Black" 
               FontFamily="{StaticResource HeadlineCommonFamiy}" 
               Pivot.SlideInAnimationGroup="GroupTwo" Height="63" 
               FontWeight="Bold" TextTrimming="CharacterEllipsis"/> 
        <TextBlock Text="{Binding Abstract}" TextWrapping="Wrap" FontSize="15" FontStyle="Italic" 
            Pivot.SlideInAnimationGroup="GroupTwo" Margin="10 5 0 10" 
              FontFamily="{StaticResource AbstractCommonFamily}"/>     
       </StackPanel> 
       <StackPanel x:Name="descriptionSP" Background="White"> 
       <RichTextBlock IsTextSelectionEnabled="False" x:Name="richTextBlock" 
           local:Properties.Html="{Binding ArticleDetail}" TextWrapping="Wrap" 
           Pivot.SlideInAnimationGroup="GroupTwo" Margin="10 5 0 10" 
             FontFamily="{StaticResource ContentControlThemeFontFamily}"> 
       </RichTextBlock> 
      </StackPanel> 
      </StackPanel> 
     </DataTemplate> 
    </Page.Resources> 

Wie die RichTextBlock Kontrolle innerhalb des Stackpanel bekommen?

Jetzt versuche ich, mit dem folgenden Code in C# Ende:

private T FindElementInVisualTree<T>(DependencyObject parentElement) where T : DependencyObject 
     { 
      var count = VisualTreeHelper.GetChildrenCount(parentElement); 
      if (count == 0) return null; 

      for (int i = 0; i < count; i++) 
      { 
       var child = VisualTreeHelper.GetChild(parentElement, i); 
       if (child != null && child is T) 
        return (T)child; 
       else 
       { 
        var result = FindElementInVisualTree<T>(child); 
        if (result != null) 
         return result; 
       } 
      } 
      return null; 
     } 

RichTextBlock richTextBlock = new RichTextBlock(); 
      StackPanel rootStackPanel = new StackPanel(); 
      StackPanel childStackPanel = new StackPanel(); 

    PivotItem item = (sender as Pivot).ContainerFromItem((sender as Pivot).SelectedItem) as PivotItem; 
      rootStackPanel = item.ContentTemplate.LoadContent() as StackPanel; 
      childStackPanel = rootStackPanel.FindName("descriptionSP") as StackPanel; 
      richTextBlock = rootStackPanel.FindName("richTextBlock") as RichTextBlock; 

Paragraph paragraph = new Paragraph(); 
      Run run = new Run(); 

      // Customize some properties on the RichTextBlock. 
      richTextBlock.IsTextSelectionEnabled = true; 
      richTextBlock.SelectionHighlightColor = new SolidColorBrush(Windows.UI.Colors.Pink); 
      richTextBlock.Foreground = new SolidColorBrush(Windows.UI.Colors.Blue); 
      richTextBlock.FontWeight = Windows.UI.Text.FontWeights.Light; 
      richTextBlock.FontFamily = new FontFamily("Arial"); 
      richTextBlock.FontStyle = Windows.UI.Text.FontStyle.Italic; 
      richTextBlock.FontSize = 50; 
      //run.Text = "This is some sample text to demonstrate some properties."; 

      //Add the Run to the Paragraph, the Paragraph to the RichTextBlock. 
      paragraph.Inlines.Add(run); 
      richTextBlock.Blocks.Add(paragraph); 

      // Add the RichTextBlock to the visual tree (assumes stackPanel is decalred in XAML). 
      //childStackPanel.Children.Add(richTextBlock); 
      //rootStackPanel.Children.Add(richTextBlock); 

Aber ich bin nicht in der Lage RichTextBlock den Griff zu bekommen. Ich bekomme einen null Wert. Bitte helfen Sie mir. Danke.

Antwort

2

können Sie ContentTemplate von PivotItem verwenden, um die Vorlage von PivotItem zum Beispiel wie folgt zu erhalten:

PivotItem item = (sender as Pivot).ContainerFromItem((sender as Pivot).SelectedItem) as PivotItem; 
var rootStackPanel = item.ContentTemplate.LoadContent() as StackPanel; 
var richtb = rootStackPanel.FindName("richtb") as RichTextBlock; 

Und ich gab zunächst einen Namen für die RichTextBlock als „richtb“.

+0

danke @grace, ich bin in der Lage, das Richtextblock-Steuerelement zu erhalten. Ich habe eine Frage. Ich versuche, Schriftgröße auf Richtextblock als richtb.Fontsize = 20 in der C# -Ende festzulegen. Aber es hat keinen Einfluss. Aber wenn ich von Xaml setze, funktioniert es gut. Ist es richtig, die Schriftgröße im Backend einzustellen oder gibt es eine andere Möglichkeit? Bitte hilf mir. Danke –

+0

@BhanuprakashMankala, für 'RichTextBlock', müssen wir auf den' Block' dieses Steuerelements im Code dahinter zugreifen, der Inhalt ist in Blöcken, Sie können auf die Beispiele in [RichTextBlock-Klasse] (https: // msdn .microsoft.com/de-de/library/windows/apps/windows.ui.xaml.controls.richtextblock.aspx). –

+0

Wie in meinem XAML binde ich die Daten von "local: Properties.Html", und ich verwende keine Absatzeigenschaften. Ist es möglich, die Blöcke mit meinem Code zu bekommen? –

0

Der von Ihnen bereitgestellte Code durchsucht den Baum nach dem ersten übereinstimmenden Steuerelement des angegebenen Typs. Das bedeutet, dass Sie im Gegenzug die erste StackPanel in der XAML-Definition erhalten, aber die RichTextBlock in der zweiten.

Warum Sie nicht direkt das tun, statt für die StackPanel des Suchens:

var richTextBlock = FindElementInVisualTree<RichTextBlock>(item); 

Dies kehrt die RichTextBlock direkt, weil die FindElementInVisualTree Methode rekursiv den Baum der Suche nach unten.

+0

Ich habe das auch versucht, in diesem Fall bekomme ich auch null Wert. –

+0

Können Sie überprüfen, ob die Variable 'item' nicht null ist? –

+0

Ich habe mit der obigen Antwort von Grace versucht, und ich bin in der Lage, die Richtextblock-Kontrolle zu bekommen. –