문제

WPF를 사용하여 많은 양의 형식화되지 않은 텍스트 (메모장처럼)를 표시하고 편집하는 좋은 접근법은 무엇입니까? 큰 문자열을 텍스트 상자에로드하면 UI가 응답하지 않습니다. 전체 성능은 이전 Microsoft UI 프레임 워크의 텍스트 박스 컨트롤과 거의 비슷하지 않습니다.

이 문제를 해결하기 위해 어떤 옵션이 필요합니까? 텍스트 컨트롤이 텍스트를로드하는 동안 UI 스레드를 차단하고 싶지 않습니다. 또한 전체 텍스트를 컨트롤에로드하는 것이 좋지 않을 수 있기 때문에 일종의 "가상화"가 필요할 수 있습니다 (20MB의 텍스트가 보이지 않더라도 많은 글리프를 생성 할 것이라고 생각합니다). TextBox에는 더 이상 ACEDENTEXT () 메소드가 없으므로 텍스트의 비동기로드를 제어 할 수있는 방법조차 없습니다.

이것이 일반적인 문제가 아닙니까? WPF는 상자 밖에서 이것에 아무것도 제공하지 않는 것 같습니다. 왜 그렇게예요?

도움이 되었습니까?

해결책

SharpDevelop의 텍스트 편집기 인 Avalonedit는 WPF로 처음부터 완전히 작성되었으며 많은 양의 텍스트에 최적화되었습니다. 풍부한 텍스트를 지원하지는 않습니다 (구문 강조 표시 및 폴딩과 같은 기타 멋진 기능을 지원하지만). 나는 이것이 당신의 청구서에 완벽하게 맞을 것이라고 생각합니다.

다음은 개발자가 작성한 편집자에 관한 기사입니다.

http://www.codeproject.com/kb/edit/avalonedit.aspx

다른 팁

이것이 도움이 될지 확실하지 않지만 사용해 보셨습니까? FlowDocumentPageViewer 그리고 FlowDocumentReader?

또한 매우 좋은 주석 지원이 있으며 문서를 텍스트 형식으로로드하는 데 이상적입니다.

문제는 텍스트 상자가 단일 컨테이너 요소라는 것입니다. 컨테이너 재활용으로 인해 ListBox 가상화와 같은 목록 컨트롤. 텍스트 상자 속도를 높이기 위해 할 수있는 간단한 일은 없습니다.

그러나 TextBox 컨트롤에는 appendText () 메소드가 있습니다.

        TextBox tb = new TextBox();
        tb.AppendText("Hello");

예, 이것을 사용하여 언급 한 것처럼 텍스트를 동적으로 추가 할 수 있습니다.

사용자에게 텍스트를 볼 수있는 더 많은 공간을 제공하는 스타일로 텍스트 상자를 사용할 수 있습니다. Telerik과 다른 사람들의 고급 컨트롤이있을 것입니다. 그러나 편집 옵션이 필요하지 않은 경우 충분합니다.

항상 기술을 혼합하고 일치시킬 수 있습니다. WinForms TextBox를 WPF 부모에 삭제할 수 있습니다. 스타일링, 불투명도, 애니메이션, 변환 등과 같은 것을 잃어 버리지 만 중요한 모든 것이 텍스트를 편집하는 경우 winforms 텍스트 박스는 그대로됩니다.

WPF를 사용해 보셨습니까? RichTextBox? 이 경로를 가면 FlowDocument 정보를 읽고 싶을 것입니다.

당신은 사용할 수 있습니다 흐름 문서, 그러나 이것은 상자 밖으로 작동하지 않습니다. 문서 a의 속성 흐름 문서 MVVM에서.

다른 솔루션이 사용 중입니다 FlowDocumentsCrollViewer 그리고 그것에 묶습니다 문서 재산.

(또는 a를 사용할 수도 있습니다 FlowDocumentReader 그리고 묶습니다 문서 재산과 유사한 속성 FlowDocumentsCrollViewer. 이것은 당신에게 다른 UI를 제공합니다.)

보기:

 <FlowDocumentScrollViewer Document="{Binding FlowDocument, Mode=OneWay}" />

뷰 모델 :

   FlowDocument fd = new FlowDocument();
        Paragraph p = new Paragraph();
        Run r = new Run();
        r.Text = "large text";
        p.Inlines.Add(r);
        fd.Blocks.Add(p);
        FlowDocument = fd;

 private FlowDocument _FlowDocument;
    public FlowDocument FlowDocument
    {
      get{ return _FlowDocument; }
      set
      {
        _FlowDocument = value;
        NotifyOfPropertyChange(nameof(FlowDocument));
      }
    }

추가 성능 팁은 다음을 참조하십시오. https://docs.microsoft.com/en-us/dotnet/framework/wpf/advanced/optimizing-performance-text#flowdocument-textblock-and-label-controls

다음과 같은 것을 시도하는 것은 어떻습니까 :

전체 문자열을 메모리에 유지하지만 텍스트 상자에 '슬라이스'만 표시하십시오. 텍스트 상자, 글꼴 크기 등의 크기에 따라 슬라이스 문자열의 크기가 동적으로 계산됩니다.

물론 이것은 적절한 표시, 동기화 등을위한 사소한 코드가 많지 않지만 갈 길인 것 같습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top