2014-10-10 77 views
6

当在WinRT中的RichTextBlockTextBlock中显示大量文本时,我注意到WinRT XAML渲染引擎达到了极限。因此,请考虑以下简单示例,其中我已经在XAML中定义了一个RichTextBlock,并且在后面的代码中填充了大量文本。 (这将工作简单TextBlock类似。)如何在Windows应用商店应用程序中显示大量文本?

这是XAML部分:

<ScrollViewer> 
    <RichTextBlock Name="rtb" /> 
</ScrollViewer> 

而且一些代码背后填满它:

void MainPage_Loaded(object sender, Windows.UI.Xaml.RoutedEventArgs e) 
{ 
    string text = Enumerable.Range(0, 200).Aggregate("", (current, i) => current + loremipsum); 
    text = text.Replace("\r\n", "\n").Replace("\r", "\n"); 
    foreach (var line in text.Split('\n')) 
    { 
     var paragraph = new Paragraph(); 
     paragraph.Inlines.Add(new Run { Text = line }); 
     this.rtb.Blocks.Add(paragraph); 
    } 
} 

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, vel illum dolore eu feugiat nulla facilisis. "; 

在第一时刻,这似乎工作,但是当你开始缩放应用时会冻结并崩溃,因为xaml渲染器失败。没有任何交互,这会立即发生大量文本。

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

注意:我还没有试过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> 

有了这个解决方案,应用程序不再崩溃,但真的缺乏性能。

+0

我会检查以确保您使用的支持[增量加载]的支持项目集合(http://msdn.microsoft.com/en-us/library/windows/apps/dn535964.aspx)。您还可以分阶段加载文本,以便即使文本不存在,也能保持高性能和响应,类似于图像处理。另外,你是否不断从磁盘读取文本?如果是这样的话,一开始就把它加载到内存中可能是有益的。另外,您可能需要阅读[this](http://msdn.microsoft.com/zh-cn/library/windows/apps/hh994637.aspx)。也许尝试'ItemsStackPanel'? – 2014-10-10 17:55:21

+0

我会结合你的虚拟化和将你的文本分割成部分。 – khamitimur 2015-03-05 08:02:53

回答

1

准备好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> 

和工程就像一个魅力!

+0

文字快速显示但不滚动。所示的代码不起作用。 Win2D需要一个NUGET包。像速度一样,太糟糕了,它实际上并不工作。 – 2015-10-05 19:14:17

相关问题