2010-01-25 96 views
8

当您尝试在XAML中构造FixedDocument时,Visual Studio显示错误a well-known bug。例如,下面的片段WPF:Visual Studio 2008设计器中的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文件中构建文档而不会收到该错误消息。我找到了一种解决方法,我想在下面分享这个答案,但我很好奇,如果有更好的(更优雅的)解决方案。

回答

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> 
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> 

然后我的页面连接到的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); 
相关问题