2010-01-25 17 views
8

To jest a well-known bug Visual Studio pokazuje błąd podczas próby zbudowania FixedDocument w XAML. Na przykład, następujący fragmentWPF: FixedDocument w Visual Studio 2008 Designer

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

kompiluje i działa perfekcyjnie, ale Visual Studio pokazuje błąd na liście błędów (Property 'Pages' does not support values of type 'PageContent'.) jest to dość irytujące.

Szukam rozwiązania, które pozwala mi budować moje dokumenty w pliku XAML w Visual Studio bez otrzymywania tego komunikatu o błędzie. Znalazłem obejście, które chciałbym udostępnić poniżej jako odpowiedź, ale jestem ciekawy, czy istnieje lepsze (bardziej eleganckie) rozwiązanie.

Odpowiedz

3

wiem, że to już odpowiedział, ale myślę, że ta odpowiedź jest ładniejszy, ponieważ nie wymaga dodawania DocumentView.

Jeśli istnieje sposób na odniesienie zasobów za pomocą nazwy klucza i umieszczenie ich w dokumencie FixedDocument za pomocą XAML, proszę dać mi znać. Nie mogę znaleźć sposobu na zrobienie tego, ale może to jest możliwe.

Zastosowanie:

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

metodę rozszerzenia:

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

Jako obejście, kładę DocumentViewer jak również strony w siatce:

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

Potem dołączyć stronę do DocumentViewer w przypadku Loaded okna:

VB przykład:

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# przykład:

((Grid)uiPage1.Parent).Children.Remove(uiPage1); 
var content = new PageContent(); 
((IAddChild)content).AddChild(uiPage1); 
uiReport.Pages.Add(content); 
Powiązane problemy