Dot-Net

WPF:Visual Studio 2008 設計器中的 FixedDocument

  • September 30, 2020

當您嘗試在 XAML中構造 a 時,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 文件中建構我的文件,而不會收到該錯誤消息。我找到了一種解決方法,我想在下面分享它作為答案,但我很好奇是否有更好(更優雅)的解決方案。

我知道這已經得到了回答,但我認為這個答案更好,因為它不需要您添加 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>

作為一種解決方法,我將 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);

引用自:https://stackoverflow.com/questions/2133240