代码之家  ›  专栏  ›  技术社区  ›  Heinzi

WPF:VisualStudio2008设计器中的固定文档

  •  8
  • Heinzi  · 技术社区  · 16 年前

    a well-known bug 当您尝试构造 FixedDocument 在XAML中。例如,下面的代码段

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

    Property 'Pages' does not support values of type 'PageContent'. )这很烦人。

    3 回复  |  直到 16 年前
        1
  •  3
  •   Charlie    15 年前

    如果有办法通过密钥名引用资源,并使用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>
    
        2
  •  4
  •   Heinzi    9 年前

    进入网格:

    <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 窗口事件:

    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
  •  3
  •   hillin    7 年前

    更清洁的解决办法:

    [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 属性并将所有添加的页面重定向到真实页面 页

    <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

        4
  •  1
  •   Null Pointer    6 年前

    所以我在处理固定文档时遇到了同样的问题。我认为这可能是一个比其他人建议的更干净的解决办法。

    FixedDocument hillin 建议,并添加要获取的属性 固定文档 PageContents . 但是,由于这些页面现在是另一个对象的可视子对象,您应该使用XmlReader和XmlWriter类对它们进行复制。

    [ContentProperty("Pages")]
    public class CustomFixedDocument : FixedDocument
    {
        private ObservableCollection<PageContent> _pages;
    
        public CustomFixedDocument()
        {
            this.Pages = new ObservableCollection<PageContent>();
        }
    
        public FixedDocument FixedDocument
        {
            get
            {
                var document = new FixedDocument();
                foreach (var p in Pages)
                {
                    var copy = XamlReader.Parse(XamlWriter.Save(p)) as PageContent;
                    document.Pages.Add(copy);
                }
                return document;
            }
        }
    
        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);
                        }
                    }
                };
            }
        }
    }
    

    现在在xaml中,您可以轻松创建 CustomFixedDocument DocumentViewer 到它的“FixedDocument”属性。

    <Window x:Class="MyProject.DocumentWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:MyProject"
        mc:Ignorable="d"
        Title="DocumentWindow" Height="450" Width="800" Loaded="Window_Loaded">
    <Window.Resources>
        <local:CustomFixedDocument x:Key="Report">
            <PageContent>
                <FixedPage Width="793.76" Height="1122.56">
                    <TextBlock Margin="50" Text="Page 1"/>
                </FixedPage>
            </PageContent>
            <PageContent>
                <FixedPage Width="793.76" Height="1122.56">
                    <TextBlock Margin="50" Text="Page 2"/>
                </FixedPage>
            </PageContent>
        </local:CustomFixedDocument>
    </Window.Resources>
    <Grid>
        <DocumentViewer x:Name="viewer" Document="{Binding Source={StaticResource Report}, Path=FixedDocument}"/>
    </Grid>
    

    现在这两个问题都得到了解决。有实时设计时预览,没有编译错误,可以打印输出。

    推荐文章