Как я могу добавить несколько FlowDocumentReaders в StackPanel? - PullRequest
4 голосов
/ 18 февраля 2010

Благодаря ответу Леома Мне удалось добавить FlowDocument к StackPanel , обернув его в FlowDocumentReader .

Но теперь у меня две проблемы:

  • похоже добавлен только первый FlowDocumentReader, а остальные игнорируются
  • есть нежелательное поле , от которого я не могу избавиться

Как я могу добавить несколько FlowDocumentReaders в StackPanel без нежелательного поля?

альтернативный текст http://www.deviantsart.com/upload/1ndiqqe.png

XAML:

<Window x:Class="TestFlowdoc23432.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="200" Width="300">
    <StackPanel Margin="10">
        <ContentControl x:Name="MainArea"/>
    </StackPanel>
</Window>

Код сзади:

using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;

namespace TestFlowdoc23432
{
    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();

            StackPanel sp = new StackPanel();

            TextBlock tb1 = new TextBlock();
            tb1.Text = "first text block";
            sp.Children.Add(tb1);

            TextBlock tb2 = new TextBlock();
            tb2.Text = "second text block";
            sp.Children.Add(tb2);

            sp.Children.Add(GetFlowDocumentReader("first flow document reader"));
            sp.Children.Add(GetFlowDocumentReader("second flow document reader"));

            MainArea.Content = sp;
        }

        FlowDocumentReader GetFlowDocumentReader(string text)
        {
            FlowDocumentReader fdr = new FlowDocumentReader();
            FlowDocument fd = new FlowDocument();
            fdr.Document = fd;
            fdr.Margin = new Thickness(0);
            Paragraph par = new Paragraph();
            par.Margin = new Thickness(0);
            fd.Blocks.Add(par);

            Run r = new Run(text);
            par.Inlines.Add(r);

            return fdr;
        }

    }
}

1 Ответ

3 голосов
/ 18 февраля 2010

Чтобы текст отображался слева, вам нужно установить свойство pagepadding в вашем flowdocument следующим образом:

fd.PagePadding = new Thickness(0);

причина, по которой вы, похоже, получаете только первого читателя, заключается в том, что он заполняет доступное пространство (переместите его, чтобы он стал первым объектом, и вы не увидите текстовые блоки). Если вы измените FlowDocumentReader на FlowDocumentScrollViewer и воспользуетесь свойством VerticalScrollBarVisibility, то вы сможете получить желаемый эффект. Ниже приведен метод GetFlowDocumentReader с примененными изменениями:

FlowDocumentScrollViewer GetFlowDocumentReader(string text)
        {
            FlowDocumentScrollViewer fdr = new FlowDocumentScrollViewer();

            FlowDocument fd = new FlowDocument();
            fdr.Document = fd;
            fdr.Margin = new Thickness(0);
            Paragraph par = new Paragraph();
            par.Margin = new Thickness(0);
            fd.Blocks.Add(par);

            Run r = new Run(text);
            par.Inlines.Add(r);

            fd.PagePadding = new Thickness(0);
            fdr.VerticalScrollBarVisibility = ScrollBarVisibility.Hidden;

            return fdr;
        }
...