Bhanuprakash Mankala
Bhanuprakash Mankala

Reputation: 245

How to get controls inside Pivot.ItemTemplate in Pivot in UWP?

I have the following code:

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

How to get the RichTextBlock control inside the stackpanel?

Now, I am trying with the following code in the C# end:

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

But I am not able to get the control RichTextBlock. I am getting a null value. Please help me. Thanks.

Upvotes: 3

Views: 615

Answers (2)

Grace Feng
Grace Feng

Reputation: 16652

You can use ContentTemplate of PivotItem to get the template of PivotItem for example like this:

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;

And I firstly gave a name to the RichTextBlock as "richtb".

Upvotes: 3

Martin Zikmund
Martin Zikmund

Reputation: 39082

The code you provided searches the tree for the first matching control of the given type. This means, that what you get in return is the first StackPanel in the XAML definition, but the RichTextBlock in the second one.

Why don't you directly do this, instead of searching for the StackPanel:

var richTextBlock = FindElementInVisualTree<RichTextBlock>(item);

This will return the RichTextBlock directly, because the FindElementInVisualTree method is searching down the tree recursively.

Upvotes: 0

Related Questions