編集:
わかりました、それは一種の解決策ですが、汚れているように感じます:
foreach (ContainerVisual cv in SurfaceNYTR.Helpers.VFTreeHelper.FindVisualChildren<ContainerVisual>(flowDocReader))
{
if (cv.Parent.DependencyObjectType.SystemType.FullName == "MS.Internal.PtsHost.PageVisual")
{
flowDocReader.Width = cv.DescendantBounds.Width;
}
}
Snoop を調べたところ、ContainerVisual オブジェクトの 1 つがその DescendantBounds プロパティに正しい幅を格納しているようです。その親はPageVisualです(ただし、このクラスは内部であるため、文字列はSystemType.FullNameまたはGetType()と比較されます。ToString()が使用されましたが、これはおそらく最悪です)
注: FindVisualChildren はすべての子をタイプ別に検索します。そのソースはここにあります
私の目標は、FlowDocument のコンテンツ全体を (つまり、改ページせずに) 列レイアウトで表示することです。高さは固定されますが、幅は FlowDocument の内容によって異なります。
私の問題は、 FlowDocumentReader が FlowDocument の内容に合わせて自動的にサイズ変更されないことです。以下の XAML でわかるように、FlowDocumentReader.Width は 5000 ユニット (ほとんどのドキュメントに対応できる数) です。Auto にすると、ScrollViewer の幅に合わせてクリップされ、私のものにページが付けられます。
この問題を解決する適切な方法はありますか?
これが現在どのように見えるかのスクリーンショットも作成しましたが、ほとんどの場合、ScrollViewer はドキュメントの最後を超えてスクロールします: http://i.stack.imgur.com/3FSRl.png
<ScrollViewer x:Name="scrollViewer"
HorizontalScrollBarVisibility="Visible"
VerticalScrollBarVisibility="Disabled"
>
<FlowDocumentReader x:Name="flowDocReader"
ClipToBounds="False"
Width="5000"
>
<FlowDocument x:Name="flowDoc"
Foreground="#FF404040"
ColumnRuleWidth="2"
ColumnGap="40"
ColumnRuleBrush="#FF404040"
IsHyphenationEnabled="True"
IsOptimalParagraphEnabled="True"
ColumnWidth="150">
<Paragraph>
Lorem ipsum dolor sit amet, ...etc...
</Paragraph>
<Paragraph>
Lorem ipsum dolor sit amet, ...etc...
</Paragraph>
<Paragraph>
Lorem ipsum dolor sit amet, ...etc...
</Paragraph>
</FlowDocument>
</FlowDocumentReader>
</ScrollViewer>