首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >查找段落所在的RichTextBlockOverflow

查找段落所在的RichTextBlockOverflow
EN

Stack Overflow用户
提问于 2017-12-20 20:16:21
回答 1查看 87关注 0票数 1

在昨天回答了我的问题之后,我写了这段代码,但它出错了,因为“段落”不是RichTextBlockOverflow的“孩子”,而是第一个RichTextBlock (我想这就是原因)。因此,我想知道是否有可能知道哪个RichTextBlockOverflow是“段落列表”的段落,例如,编号2。

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

Xaml:

代码语言:javascript
复制
 <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>

代码:

代码语言:javascript
复制
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的名称?

提前感谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-12-20 20:30:37

这在您的情况下应该是可行的:

代码语言:javascript
复制
RichTextBlockOverflow parent = paragraphlist[2].ElementStart.VisualParent as RichTextBlockOverflow;

通常,一个段落可以占用多个RichTextBlockOverflow元素和一个RichTextBlock。如果你需要找到所有的它们,那么第一个和最后一个应该是:

代码语言:javascript
复制
var firstOccupiedBlock = paragraph.ElementStart.VisualParent;
var lastOccupiedBlock = paragraph.ElementEnd.VisualParent;

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47905884

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档