C# 如何在Windows应用商店应用程序中显示大量文本?

C# 如何在Windows应用商店应用程序中显示大量文本?,c#,xaml,windows-8,windows-runtime,C#,Xaml,Windows 8,Windows Runtime,在WinRT中,当在RichTextBlock甚至在TextBlock中显示大量文本时,我注意到WinRT XAML呈现引擎达到了极限。因此,考虑下面的简单示例,在这里我定义了XAML中的 ReXTraveBubs/COD>,在这里我用代码后面填充了大量的文本。(这与简单的TextBlock类似) 这是XAML部分: <ScrollViewer> <RichTextBlock Name="rtb" /> </ScrollViewer> 在第一时刻,这

在WinRT中,当在
RichTextBlock
甚至在
TextBlock
中显示大量文本时,我注意到WinRT XAML呈现引擎达到了极限。因此,考虑下面的简单示例,在这里我定义了XAML中的<代码> ReXTraveBubs/COD>,在这里我用代码后面填充了大量的文本。(这与简单的
TextBlock
类似)

这是XAML部分:

<ScrollViewer>
    <RichTextBlock Name="rtb" />
</ScrollViewer>
在第一时刻,这似乎是可行的,但当你开始缩放时,应用程序将冻结并崩溃,因为xaml渲染器失败。在没有任何交互的情况下,这会立即发生在大量文本中

所以问题是:如何在WinRT中显示大量文本,其中“大”意味着大约100KB的文本,甚至更高达5MB

注意:我还没有尝试WebBrowser控件,因为它应该是只读的,我希望避免复制和粘贴。所以WebBrowser控件不是我的选择

编辑

我找到了一个临时解决方案,将行作为项目添加到
ItemsControl
,在该控件中项目被虚拟化

<ItemsControl Name="ItemsControl">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <VirtualizingStackPanel/>
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <ItemsControl.Template>
        <ControlTemplate TargetType="ItemsControl">
            <ScrollViewer>
                <ItemsPresenter/>
            </ScrollViewer>
        </ControlTemplate>
    </ItemsControl.Template>
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding}"/>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>


使用此解决方案,应用程序不再崩溃,但确实缺乏性能。

准备好Win2D。以下工作非常顺利:

public class InifiniteTextBlock : Grid
{
    CanvasControl canvasControl;

    public InifiniteTextBlock()
    {
       Initialize();
    }

    private const string loremipsum = @"
Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. 
Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. 
Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. 
Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. 
Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, velillum dolore eu feugiat nulla facilisis. ";

    private string largeloremipsum;

    private async void Initialize()
    {
        canvasControl = new CanvasControl() { ClearColor = Colors.Transparent, Width = 480, Height = 4000 };
        largeloremipsum = String.Concat(loremipsum, loremipsum, loremipsum, loremipsum, loremipsum);
        this.Children.Insert(0, canvasControl);
        while (!canvasControl.ReadyToDraw)
        {
            await Task.Delay(60);
        }

        canvasControl.Draw += (s, e) =>
        {
            var test = new CanvasTextFormat();
            e.DrawingSession.DrawText(largeloremipsum, new Rect(0,0,480,4000), Colors.Black, test);
        };
        canvasControl.Invalidate();
    }
}
然后在XAML中执行以下操作:

<ScrollViewer>
  <local:InifiniteTextBlock/>
</ScrollViewer>


而且很有魅力

我会检查以确保您正在使用支持的支持项集合。您还可以分阶段加载文本,这样即使文本没有立即出现,它也仍然具有性能和响应性,类似于图像处理。另外,您是否一直在从磁盘读取文本?如果是这样的话,从一开始就将其全部加载到内存中可能是有益的。此外,你可能还想仔细阅读。也许可以尝试
ItemsStackPanel
?我会将您的方法与虚拟化结合使用,并将文本拆分为多个部分。文本显示速度很快,但不会滚动。如图所示的代码不起作用。Win2D需要一个NUGET包。就像速度一样,可惜它实际上不起作用。
<ScrollViewer>
  <local:InifiniteTextBlock/>
</ScrollViewer>