找到段落所在的RichTextBlockOverflow UWP

时间:2017-12-20 12:16:21

标签: c# uwp

昨天回答我的问题之后我编写了这段代码,但是它出错了,因为“段落”不是RichTextBlockOverflow的“子”,而是第一个RichTextBlock(我认为这就是原因)。所以我想知道是否可以知道哪个RichTextBlockOverflow是“paragraphlist”的段落,例如,数字2。

生成的错误是:System.NullReferenceException:'对象引用未设置为对象的实例。'并在点击btnParent按钮时生成(例2)。

的Xaml:

 <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
    <StackPanel Orientation="Vertical" VerticalAlignment="Center" HorizontalAlignment="Center">
        <Grid x:Name="Menù" Width="290" Padding="0" Margin="40">
            <Grid Background="White">
                <Grid.RowDefinitions>
                    <RowDefinition Height="50"/>
                    <RowDefinition Height="50"/>
                    <RowDefinition Height="50"/>
                </Grid.RowDefinitions>
                <Button  Grid.Row="0" x:Name="btnLoadText" Click="btnLoadText_Click" Content="Display text" HorizontalAlignment="Center" VerticalAlignment="Center" Width="270" Foreground="White" Height="32"/>
                <Button Grid.Row="1" x:Name="btnParent" Click="btnParent_Click" Content="Parent Name" HorizontalAlignment="Center" VerticalAlignment="Center" Width="270" Foreground="White" Height="32"/>
                <Button Grid.Row="2" x:Name="btnCount" Click="btnCount_Click" Content="Count" HorizontalAlignment="Center" VerticalAlignment="Center" Width="270" Foreground="White" Height="32"/>
            </Grid>
        </Grid>
        <Grid x:Name="BaseGrid" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"  Width="720" Height="350">
            <ScrollViewer x:Name="PageViewer" VerticalScrollBarVisibility="Disabled" HorizontalScrollBarVisibility="Visible" VerticalScrollMode="Disabled" HorizontalScrollMode="Enabled" Background="LightGreen">
                <StackPanel x:Name="StackViewer" Orientation="Horizontal"/>
            </ScrollViewer>
        </Grid>
    </StackPanel>
</Grid>

代码:

public sealed partial class MainPage : Page
{
    List<Paragraph> paragraphlist = new List<Paragraph>();
    RichTextBlock TextOneRich = new RichTextBlock() { Margin = new Thickness(20) };
    List<RichTextBlockOverflow> TextList = new List<RichTextBlockOverflow>();

    public MainPage()
    {
        this.InitializeComponent();

        StackViewer.Children.Add(TextOneRich);
        TextOneRich.Width = 200;
        TextOneRich.TextAlignment = TextAlignment.Justify;
        TextOneRich.Name = "RichTextOne";
    }

    private async void btnLoadText_Click(object sender, RoutedEventArgs e)
    {
        TextList.Clear();
        TextOneRich.Blocks.Clear();
        StackViewer.Children.Clear();
        StackViewer.Children.Add(TextOneRich);

        Paragraph paragraphONE = new Paragraph();
        paragraphONE.Inlines.Clear();
        paragraphONE.Inlines.Add(new Run { Text = "ONE Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus, nascetur ridiculus mus Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus." });
        paragraphlist.Add(paragraphONE);

        Paragraph paragraphTWO = new Paragraph();
        paragraphTWO.Inlines.Clear();
        paragraphTWO.Inlines.Add(new Run { Text = "TWO Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus, nascetur ridiculus mus Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus." });
        paragraphlist.Add(paragraphTWO);

        Paragraph paragraphTHREE = new Paragraph();
        paragraphTHREE.Inlines.Clear();
        paragraphTHREE.Inlines.Add(new Run { Text = "THREE Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus, nascetur ridiculus mus Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus." });
        paragraphlist.Add(paragraphTHREE);

        int ThereIsTexts = 0;
        int CountName = 1;
        for (int i = 0; i <= ThereIsTexts; i++)
        {
            if (i == 0)
            {
                TextOneRich.Blocks.Add(paragraphONE);
                TextOneRich.Blocks.Add(paragraphTWO);
                TextOneRich.Blocks.Add(paragraphTHREE);

                await Task.Delay(300);

                if (TextOneRich.HasOverflowContent)
                {
                    TextList.Add(new RichTextBlockOverflow() { Width = 200, Margin = new Thickness(20) });
                    StackViewer.Children.Add(TextList[TextList.Count - 1]);
                    TextOneRich.OverflowContentTarget = TextList[TextList.Count - 1];
                    TextList[TextList.Count - 1].Name = "RichOverflo" + CountName.ToString();
                    CountName += 1;
                    ThereIsTexts += 1;
                }
            }
            else
            {
                await Task.Delay(300);
                if (TextList[TextList.Count - 1].HasOverflowContent)
                {
                    TextList.Add(new RichTextBlockOverflow() { Width = 200, Margin = new Thickness(20) });
                    StackViewer.Children.Add(TextList[TextList.Count - 1]);
                    TextList[TextList.Count - 2].OverflowContentTarget = TextList[TextList.Count - 1];
                    TextList[TextList.Count - 1].Name = "RichOverflo" + CountName.ToString();
                    CountName += 1;
                    ThereIsTexts += 1;
                }
            }
        }
    }

    private async void btnParent_Click(object sender, RoutedEventArgs e)
    {
        //// *** Exmple 1 work ***
        //RichTextBlock parent = (paragraphlist[2] as Paragraph).ElementStart.Parent as RichTextBlock;
        //string parentName = (parent as RichTextBlock).Name;
        //var messageDialog = new MessageDialog("The parent is: " + parentName);
        //await messageDialog.ShowAsync();


        //// *** Example 2 not work ***
        RichTextBlockOverflow parent = (paragraphlist[2] as Paragraph).ElementStart.Parent as RichTextBlockOverflow;
        string parentName = (parent as RichTextBlockOverflow).Name;
        var messageDialog = new MessageDialog("The parent is: " + parentName);
        await messageDialog.ShowAsync();
    }

    private async void btnCount_Click(object sender, RoutedEventArgs e)
    {
        var messageDialog = new MessageDialog("The number of Bloks is: " + TextOneRich.Blocks.Count);
        await messageDialog.ShowAsync();
    }
}

是否可以找到段落编号为2的RichTextBlockOverflow的名称?

提前致谢!

1 个答案:

答案 0 :(得分:2)

这适用于您的情况:

RichTextBlockOverflow parent = paragraphlist[2].ElementStart.VisualParent as RichTextBlockOverflow;

通常,段落可能会占用多个RichTextBlockOverflow元素和RichTextBlock。如果你需要找到所有这些,那么第一个和最后一个将是:

var firstOccupiedBlock = paragraph.ElementStart.VisualParent;
var lastOccupiedBlock = paragraph.ElementEnd.VisualParent;

通过跟踪从RichTextBlockOverflow开始的链式OverflowContentTarget元素的RichTextBlockOverflow属性,可以找到它们之间的firstOccupiedBlock元素。