2009-05-13 8 views
1

저는 C# 및 VS2008에서 작업하고 있습니다.WPF - FlowDocument의 너비를 조정하십시오.

상당수의 짧은 줄 (예 : 기간 및 줄 바꿈)이 포함 된 단락이 포함 된 FlowDocument가 포함 된 WPF 응용 프로그램이 있습니다. 그러나 줄의 길이는 다양합니다. FlowDocument의 너비가 줄 바꿈없이이 줄 중에서 가장 긴 줄을 수용하기에 충분히 커서 좋지만 공간을 낭비하지 않기 위해 더 넓지는 않을 것입니다.

너비 = 자동으로 그리드 열에 넣는 것은 작동하지 않습니다. FlowDocument가 여러 너비에 맞게 유효하게 줄 바꿈 할 수 있기 때문에 FlowDocument는 항상 허용되는 최대 너비를 소비합니다.

코드에서 코드를 생성하고 각 코드의 폭을 계산할 때 줄을 통과 할 수는 있지만 Span 또는 Run 클래스에는 Width 속성이 표시되지 않습니다.

이 문서의 너비를 자동 또는 수동으로 설정하는 방법에 대한 아이디어가 있으십니까?


나는 AndrewS가 제안한 아이디어를 사용하여 FlowDocument에서 각 줄이 들어있는 레이블의 StackPanel로 옮겼습니다.

 Label itemLabel = new Label(); 
     // pad left and right, keep close top and bottom 
     itemLabel.Padding = new Thickness(2,0,2,0); 
     itemLabel.Content = contentSpan; 
     this.itemsStackPanel.Children.Add(itemLabel); 

크기 조정은 이제 완벽하고 유일한하다가 글꼴이 정확히 같은 보이지 않는 경우 : XAML 마크 업

<Border BorderThickness="2" Margin="2" BorderBrush="Black"> 
    <ScrollViewer HorizontalScrollBarVisibility="Disabled" VerticalScrollBarVisibility="Auto"> 
     <StackPanel 
     Orientation="Vertical" 
      x:Name="itemsStackPanel" /> 
    </ScrollViewer> 
</Border> 

코드는 스팬을 생성하고 다음과 같이 추가합니다입니다 패밀리와 글꼴 크기가 같고 (Segoe UI, 15pt) 글꼴이 있지만 FlowDocument의 레이블이 FlowDocument의 줄보다 훨씬 더 멀리 보이기는하지만 그 옆에 FlowDocument가 있습니다. 나는 이것을 묻습니다 a separate question

답변

1

TextBlocks 또는 Labels (줄 바꿈을 제어 할 수있는)와 같은 다른 유형의 요소로 줄을 대체하거나 "고정 형식 문서 표현 및 인쇄 시나리오 용으로 설계된"Glyphs로 바꿀 수 있습니다. .

필자는 선을 측정하고 문서 너비를 강요하려고하지 않는다고 생각합니다.

1

비슷한 상황이지만 줄 너비를 측정하고 싶습니다. 안타깝게도 RichTextBox에는 실행 및 서식 지정시 텍스트 전경색과 배경색이 함께 묶여있는 두 가지 중요한 기능이 있습니다. 색상이 필요하며 형식 지정에 신경을 쓸 필요가 없습니다. "그리드"문자가 있고 문자 위로 여러 "커서"를 실행하고 싶습니다. 배경 색상을 개별 커서로 구현하고 전경 색상을 구문 색상 지정에 사용할 계획입니다. 고정 너비 글꼴이고 그리드가 본질적으로 서식이 없기를 원하지 않습니다. 이 텍스트를 얼마나 큰지에 따라 런타임에 행과 열을 설정하는 그리드로 구현할 수 있다고 가정합니다. 그러나 리소스가 실제로 낭비되는 것처럼 보입니다. 특히 파일이 너무 큰 경우 (예 : 100x100 그리드) 모든 셀에 별도의 레이블. 원래, 그리고 조금 순진하게, 나는 그것이 RichTextBox로 스냅 될 것이라고 생각했지만, 나는 그렇지 않다는 것을 믿기 시작했다. 또 다른 가능성은 표준 TextBox 위에 캔버스를 놓고 직접 직사각형을 그리는 것입니다. 물건 스크롤과 같이 모든 것을 처리해야하는 등 추악하고 오류가 날 수 있습니다. 내 코드는 바로 지금입니다 : 내가 코멘트에서 국가로

private static void SetRichText(RichTextBox rtb, string[] arLines) 
    { 
     Contract.Assert(arLines.All(l => l.Length == arLines[0].Length)); 
     FlowDocument doc = new FlowDocument { PageWidth = 65535.0 }; 

     IEnumerable<Paragraph> iep = arLines.Select(l => 
              { 
               Paragraph p = new Paragraph(); 
               p.Inlines.Add(new Run(l)); 
               return p; 
              }); 
     foreach (Paragraph p in iep) 
     { 
      doc.Blocks.Add(p); 
     } 

     rtb.Document = doc; 
     doc.PagePadding = new Thickness(0, 0, 0, 0); 

     Rect rcEOL = rtb.Document.ContentStart.GetPositionAtOffset(arLines[0].Length).GetCharacterRect(LogicalDirection.Forward); 
     // TODO : Figure why I have to add a fudge factor in the following (I'm guessing some margin I'm unaware of in the 
     // RichTextBox somewhere)... 
     rtb.Document.PageWidth = rcEOL.Right + 18; 
    } 

이 내 현재의 경우에 작동하는 것 같다,하지만 난 그게 작동 여부를 확실하지 않다, 그래서 정말 많은 다른 사람과 테스트하지 않았습니다 일반, 플러스 그것은 어쨌든 내가 설명 할 수없는 큰 kludge이야 그래서 제대로 처리하는 방법을 알고 싶습니다. 모든 응답 주셔서 감사합니다.아, 위에서 언급했듯이 for는 고정 된 피치이고 모든 들어오는 문자열은 계약에 의해 시행되는 길이와 같으므로 모든 줄은 정확히 같은 길이 여야합니다.

관련 문제