2009-05-13 2 views
1

Я работаю на C# и VS2008.WPF - Разработайте ширину для FlowDocument

У меня есть приложение WPF, содержащее FlowDocument, которое содержит абзац, содержащий несколько довольно коротких строк (т. Е. Spans и LineBreaks). Однако длина линий меняется. Я бы хотел, чтобы ширина FlowDocument была достаточно большой, чтобы разместить самую длинную из этих строк без упаковки, но не шире, чтобы не тратить пространство.

Ввод его в столбец сетки с шириной = Авто не работает: FlowDocument всегда использует максимально допустимую ширину, так как FlowDocument может быть завербован в соответствии с несколькими различными ширинами.

Я мог бы пройти через строки, когда я их генерирую в коде, и выработать ширину для каждого из них, но я не вижу свойства Width на классах Span или Run.

Любые идеи о том, как автоматически или вручную установить ширину для этого документа?


Я использовал предложенную идею Andrews и переехал из FlowDocument в StackPanel этикеток каждая из которых содержит строку. XAML разметке

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

код создает пролеты и добавляет их следующим образом:

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

калибровочный идеально подходит сейчас, и только загвоздка в том, что шрифт не выглядит точно так же, как FlowDocument рядом с ним, несмотря на то, что шрифт Family и Font Size одинаковый (Segoe UI, 15pt) и что ярлыки выглядят намного дальше, чем строки в 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 - фиксированный шаг, и все входящие строки имеют ту же длину, что и в соответствии с контрактом, поэтому все строки должны быть одинаковой длины.