WPF: FixedDocument в Visual Studio 2008 Designer - PullRequest
8 голосов
/ 25 января 2010

Это общеизвестная ошибка , что Visual Studio выдает ошибку при попытке построить FixedDocument в XAML. Например, следующий фрагмент

<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'.). Это довольно раздражает.

Я ищу решение, которое позволило бы мне создавать свои документы в файле XAML в Visual Studio без получения этого сообщения об ошибке. Я нашел обходной путь, которым я хотел бы поделиться ниже в качестве ответа, но мне любопытно, есть ли лучшее (более элегантное) решение вокруг.

Ответы [ 3 ]

4 голосов
/ 25 января 2010

В качестве обходного пути я поместил 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>

Затем я прикрепляю страницу к DocumentViewer в Loaded Событие окна:

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);
3 голосов
/ 14 сентября 2011

Я знаю, что на этот вопрос уже был дан ответ, но я думаю, что этот ответ более приятный, поскольку не требует добавления DocumentView.

Если есть способ ссылаться на ресурсы по имени ключа и помещать их в FixedDocument с XAML, пожалуйста, дайте мне знать. Кажется, я не могу найти способ сделать это, но, возможно, это возможно.

Использование:

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>
1 голос
/ 01 ноября 2018

Обходной путь чище:

[ContentProperty("Pages")]
public class XamlFixedDocument : FixedDocument
{
    private ObservableCollection<PageContent> _pages;

    public XamlFixedDocument()
    {
        this.Pages = new ObservableCollection<PageContent>();
    }

    public new ObservableCollection<PageContent> Pages
    {
        get => _pages;
        set
        {
            _pages = value;

            foreach (var page in _pages)
            {
                base.Pages.Add(page);
            }

            _pages.CollectionChanged += (o, e) =>
            {
                if (e.NewItems != null)
                {
                    foreach (PageContent page in e.NewItems)
                    {
                        base.Pages.Add(page);
                    }
                }
            };
        }
    }
}

Этот подкласс FixedDocument подделывает свойство Pages и перенаправляет все добавленные страницы в реальное свойство Pages в его базовом классе.

Использование:

<doc:XamlFixedDocument xmlns:doc="clr-namespace:Hillinworks.WPF.Document">
    <PageContent>
        <FixedPage Background="White">
            <TextBlock Text="hello, world" />
        </FixedPage>
    </PageContent>
</doc:XamlFixedDocument>

Измените Hillinworks.WPF.Document на пространство имен, в котором находится класс XamlFixedDocument.

Это также позволяет просматривать документ во время разработки.

...