11

XAML でを作成しようとすると、Visual Studio でエラーが表示されることはよく知られているバグです。FixedDocumentたとえば、次のスニペット

<DocumentViewer>
    <FixedDocument>
        <PageContent>
            <FixedPage Width="21.0cm" Height="29.7cm">
                <TextBlock>Hello World!</TextBlock>
            </FixedPage>
        </PageContent>
    </FixedDocument>
</DocumentViewer>

コンパイルして問題なく実行できますが、Visual Studio のエラー リストにエラーが表示されます ( Property 'Pages' does not support values of type 'PageContent'.)。これは非常に厄介です。

エラー メッセージが表示されずに、Visual Studio の XAML ファイルでドキュメントを作成できるソリューションを探しています。以下で回答として共有したい回避策を見つけましたが、より良い(よりエレガントな)解決策があるかどうか知りたいです。

4

4 に答える 4

4

回避策として、DocumentViewer とページをグリッドに配置しました。

<Grid>
    <FixedPage Width="21.0cm" Height="29.7cm" x:Name="uiPage1">
        <TextBlock>Hello World!</TextBlock>
    </FixedPage>
    <DocumentViewer>
        <FixedDocument x:Name="uiReport">
        </FixedDocument>
    </DocumentViewer>
</Grid>

Loaded 次に、ウィンドウのイベントでページを DocumentViewer に添付します。

VB の例:

DirectCast(Me.uiPage1.Parent, Grid).Children.Remove(Me.uiPage1)
Dim content As New PageContent()
DirectCast(content, IAddChild).AddChild(Me.uiPage1)
Me.uiReport.Pages.Add(content)

C# の例:

((Grid)uiPage1.Parent).Children.Remove(uiPage1);
var content = new PageContent();
((IAddChild)content).AddChild(uiPage1);
uiReport.Pages.Add(content);
于 2010-01-25T15:23:51.463 に答える
3

これはすでに回答されていることは知っていますが、DocumentView を追加する必要がないため、この回答の方が優れていると思います。

リソースをキー名で参照し、XAML で FixedDocument に入れる方法があれば教えてください。私はそれを行う方法を見つけることができないようですが、おそらく可能です。

使用する:

var doc = System.Windows.Application.LoadComponent(new Uri("/FixedDocumentExample.xaml", UriKind.Relative)) as FixedDocument;
doc.AddPages();

延長方法:

using System.Collections;
using System.Windows.Documents;

public static class FixedDocumentExtended {
    public static void AddPages(this FixedDocument fixedDocument) {
        var enumerator = fixedDocument.Resources.GetEnumerator();
        while (enumerator.MoveNext()) {
            var pageContent = ((DictionaryEntry)enumerator.Current).Value as PageContent;
            if (pageContent != null) {
                fixedDocument.Pages.Add(pageContent);
            }
        }
    }
}

XAML:

<FixedDocument
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <FixedDocument.Resources>
        <PageContent x:Key="page1">
            <FixedPage Width="793.76" Height="1122.56">
                <TextBlock Margin="50" Text="Page 1"/>
            </FixedPage>
        </PageContent>
        <PageContent x:Key="page2">
            <FixedPage Width="793.76" Height="1122.56">
                <TextBlock Margin="50" Text="Page 2"/>
            </FixedPage>
        </PageContent>
    </FixedDocument.Resources>
</FixedDocument>
于 2011-09-14T19:38:43.443 に答える