Chr*_*ner 6 c# xaml windows-8 windows-runtime
当在WinRT中RichTextBlock甚至在TextBlockWinRT中显示大量文本时,我注意到WinRT XAML渲染引擎达到了极限.因此,请考虑以下简单示例,其中我已经RichTextBlock在XAML中定义了一个,并且我在后面的代码中填充了大量文本.(这对于简单来说也类似TextBlock.)
这是XAML部分:
<ScrollViewer>
<RichTextBlock Name="rtb" />
</ScrollViewer>
Run Code Online (Sandbox Code Playgroud)
并填写了一些代码:
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. ";
Run Code Online (Sandbox Code Playgroud)
在第一时间这似乎有效,但是当你开始缩放时,应用程序将冻结并崩溃,因为xaml渲染器失败.这种情况会在没有任何交互的情况下立即发生.
所以问题是:如何在WinRT中显示大量文本,其中大的意思是大约100 KB的文本,甚至更多的5 MB?
注意:我还没有尝试过WebBrowser控件,因为它应该是readonly,我想避免复制和粘贴.所以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>
Run Code Online (Sandbox Code Playgroud)
有了这个解决方案,应用程序不再崩溃,但真的缺乏性能.
为 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();
}
}
Run Code Online (Sandbox Code Playgroud)
然后在 XAML 中执行以下操作:
<ScrollViewer>
<local:InifiniteTextBlock/>
</ScrollViewer>
Run Code Online (Sandbox Code Playgroud)
而且效果就像一个魅力!
| 归档时间: |
|
| 查看次数: |
311 次 |
| 最近记录: |