2010-01-25 12 views
8

Es a well-known bug que Visual Studio muestra un error cuando se intenta construir un FixedDocument en XAML. Por ejemplo, el siguiente fragmento deWPF: FixedDocument en Visual Studio 2008 Diseñador

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

compila y ejecuta perfectamente bien, pero Visual Studio muestra un error en la lista de errores (Property 'Pages' does not support values of type 'PageContent'.) Esto es bastante molesto.

Busco una solución que me permite construyo mis documentos en un archivo XAML en Visual Studio sin conseguir que el mensaje de error. He encontrado una solución, que me gustaría compartir a continuación como una respuesta, pero tengo curiosidad si hay una solución mejor (más elegante) alrededor.

Respuesta

3

Sé que esto ya había sido contestada, pero creo que esta respuesta es más agradable, ya que no requiere añadir un DocumentView.

Si hay una manera de hacer referencia a los recursos por el nombre de la clave y ponerlas en el FixedDocument con XAML, por favor hágamelo saber. Parece que no puedo encontrar una manera de hacerlo, pero tal vez es posible.

Uso:

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

Método de extensión:

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

Como solución, puse el DocumentViewer, así como la página en una cuadrícula:

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

Entonces hay que adjuntar la página a la DocumentViewer en el Loaded caso de la ventana:

VB ejemplo:

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) 

ejemplo de C#:

((Grid)uiPage1.Parent).Children.Remove(uiPage1); 
var content = new PageContent(); 
((IAddChild)content).AddChild(uiPage1); 
uiReport.Pages.Add(content); 
Cuestiones relacionadas