FixedDocumentとFlowDocument WPF

VB Tips And Sample(HOME)VBプログラマの為のWPF入門

FixedDocumentとFlowDocument WPF

前回、DocumentViewerを試してみましたが、表示したXPSをWPFでも作成できる。
クリレポみたいにはいかないけれど、まゴリゴリ書く気ならそこそこいける?かも?
で、最初に、FlowDocument。
これは、縦横比が変わるとレイアウトが変わってくれるよーな文章というより、そのような文でよければこちらを使う。
でも、これはこの画面から印刷へは直接行かない?いけないようで、FlowDocumentにしてしまうと、Gridなどは書けなくなってしまうようです。
なので、BlockUIContainer内に、Buttonを書いています。
ちょっと、不恰好ですね。
で、印刷までの流れは、xpsに一旦おとしてそこから印刷と言った感じでしょう。
うーん使えるのかな?
flowdocumentの例flowdocumentの例その2
<Window x:Class="FlowDocument"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="FlowDocument" Height="416" Width="542">
    
    <FlowDocument>
        <Paragraph>これがFlowDocument</Paragraph>
        <Paragraph Foreground="Coral" FontStyle="Italic" FontSize="50">これがFlowDocument</Paragraph>
        <BlockUIContainer>
            <Button Name="btn">保存</Button>
        </BlockUIContainer>
    </FlowDocument>

    
</Window>

Imports System.Windows.Documents
Imports System.Windows.Xps
Imports System.Windows.Xps.Packaging


Public Class FlowDocument

    Private Sub btn_Click(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles btn.Click
        Dim xpsdoc As XpsDocument = New XpsDocument("C:\Users\admin\Documents\Visual Studio 2010\Projects\WpfApplicationTips\test.xps", System.IO.FileAccess.Write)
        Dim xpw As XpsDocumentWriter = XpsDocument.CreateXpsDocumentWriter(xpsdoc)
        For i = 0 To VisualChildrenCount - 1
            xpw.Write(GetVisualChild(i))
        Next
        xpsdoc.Close()

    End Sub
End Class



次に、FixedDocument。
こちらは、先のDocumentViewer内に直接書き込むことができる。
しかし、XAMLの潜在的なbugがあるらしく、XAML編集上ではエラーのままとなる。が、コンパイルも表示もできる。
エラー内容は、「プロパティー’Pages’は型PageContentの値をサポートしません」というもの。
エラーでも大丈夫!とは!どえりゃー時間が(約半日)悩んでしまった。トホホ・・・・・
直接印刷できるし、こちらの方がよさそうですね。
位置やマージンなどもしっかりと言うより、細かく指定できるみたいだ。
でも相当面倒になるような気がしますね。
クリレポの方がよいか??
fixeddocumentデザイン時
fixeddocument実行時
<Window x:Class="FixDocumentWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="FixDocumentWindow" Height="300" Width="300">
    <Grid >        
        <Grid.RowDefinitions>
            <RowDefinition/>
            <!--<RowDefinition/>-->
        </Grid.RowDefinitions>
        <DocumentViewer>
            <FixedDocument>
                <!--実行時に、ここに貼り付ける-->
                <PageContent>
                    <FixedPage Grid.Row="1" Width="21cm" Height="29.7cm" >
                        <Canvas>
                            <TextBox>これがFixedDocument</TextBox>
                        </Canvas>
                    </FixedPage>
                </PageContent>
            </FixedDocument>
        </DocumentViewer>


        <!--デザイン時はここで-->
        <!--<FixedPage Grid.Row="1" Width="21cm" Height="29.7cm" >
            <Canvas>
                <TextBox>これがFixedDocument</TextBox>
            </Canvas>
        </FixedPage>-->
    </Grid>
</Window>

因みに、下記は、コードのみでXPSのfixedDocumentを作成するサンプル。
XAMLをコードで組み立てていることがよく分かります。

'ReachFrameworkの参照が必要
Imports System.Windows.Xps.Packaging
Imports System.Windows.Markup
Imports System.IO.Packaging
Imports System.Windows.Xps


Private Sub btn2_Click(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles btn2.Click

        'fixedDocumentを作る
        'http://msdn.microsoft.com/ja-jp/library/system.windows.documents.fixeddocument.documentpaginator.aspx
        Dim fixedDocument As New FixedDocument()
        fixedDocument.DocumentPaginator.PageSize = New Size(96 * 8.5, 96 * 11)

        Dim PageCont As New PageContent
        Dim Fixp As New FixedPage
        Dim Cnv As New Canvas
        Dim text As New TextBox

        text.Text = "TESTTEST"
        Cnv.Children.Add(text)
        Fixp.Children.Add(Cnv)

        'http://msdn.microsoft.com/ja-jp/library/system.windows.documents.pagecontent.pagecontent.aspx
        'IAddChild にはImports System.Windows.Markupが必要
        CType(PageCont, IAddChild).AddChild(Fixp)

        fixedDocument.Pages.Add(PageCont)

        'http://msdn.microsoft.com/ja-jp/library/ms568185(VS.85).aspx
        'Imports System.IO.Packaging
        Dim pack As Package = Package.Open("C:\Users\admin\Documents\Visual Studio 2010\Projects\WpfApplicationTips\test.xps", IO.FileMode.Create)

        Dim xpsdoc As New XpsDocument(pack)

        'Imports System.Windows.Xps
        Dim writer As XpsDocumentWriter = XpsDocument.CreateXpsDocumentWriter(xpsdoc)

        writer.Write(fixedDocument.DocumentPaginator)

        xpsdoc.Close()
        pack.Close()


    End Sub



VB Tips And Sample(HOME)VBプログラマの為のWPF入門