2014-10-10 4 views
6

RichTextBlock 또는 심지어 WinRT의 TextBlock에 많은 양의 텍스트를 표시 할 때 WinRT XAML 렌더링 엔진이 한계에 도달 한 것으로 나타났습니다. XAML에서 RichTextBlock을 정의한 곳과 여기에 더 많은 양의 텍스트를 코드로 채우는 간단한 예제를 생각해보십시오. (이것은 간단한 TextBlock 비슷한 작동합니다.)Windows Store 응용 프로그램에 많은 양의 텍스트를 표시하는 방법은 무엇입니까?

이것은 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에 많은 양의 텍스트를 표시하는 방법입니다. 여기서 큰 의미는 약 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> 

이 솔루션을 사용하면 앱이 더 이상 충돌하지 않지만 실제로 성능이 떨어집니다.

+0

[증분로드] (http://msdn.microsoft.com/en-us/library/windows/apps/dn535964.aspx)를 지원하는 백업 항목 모음을 사용하고 있는지 확인합니다. 또한 텍스트를 즉시로드 할 수 있으므로 이미지 처리와 유사하게 텍스트가 즉시 나타나지 않아도 반응적입니다. 또한 디스크에서 텍스트를 계속 읽는 중입니까? 그렇다면 처음부터 모든 정보를 메모리에로드하는 것이 좋습니다. 또한 [this] (http://msdn.microsoft.com/en-us/library/windows/apps/hh994637.aspx)에서 읽을 수 있습니다. 어쩌면'ItemsStackPanel'을 시도해 보시겠습니까? –

+0

나는 당신의 승인과 가상화의 결합을 사용하여 텍스트를 부분들로 나누었다. – khamitimur

답변

1

Win2D 준비. 다음 정말 부드러운 작품 :

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

을 그리고 매력처럼 작동합니다 XAML에서 다음

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(); 
    } 
} 

는 다음을 수행합니다!

+0

텍스트는 빠르게 표시되지만 스크롤하지는 않습니다. 표시된 코드가 작동하지 않습니다. Win2D에는 NUGET 패키지가 필요합니다. 속도와 마찬가지로 너무 나빠서 실제로 작동하지 않습니다. –

관련 문제