.net - WPF: FixedDocument en Visual Studio 2008 Designer
visual-studio-2008 documentviewer (2)
Es un error bien conocido que Visual Studio muestra un error cuando intenta construir un FixedDocument
en XAML. Por ejemplo, el siguiente fragmento
<DocumentViewer>
<FixedDocument>
<PageContent>
<FixedPage Width="21.0cm" Height="29.7cm">
<TextBlock>Hello World!</TextBlock>
</FixedPage>
</PageContent>
</FixedDocument>
</DocumentViewer>
compila y funciona perfectamente bien, pero Visual Studio muestra un error en la lista de errores (la Property ''Pages'' does not support values of type ''PageContent''.
) Property ''Pages'' does not support values of type ''PageContent''.
Esto es bastante molesto.
Estoy buscando una solución que me permita construir mis documentos en un archivo XAML en Visual Studio sin obtener ese mensaje de error. He encontrado una solución, que me gustaría compartir a continuación como respuesta, pero tengo curiosidad por saber si hay una solución mejor (más elegante).
Sé que esto ya fue respondido, pero creo que esta respuesta es más agradable porque no requiere que agregue un DocumentView.
Si hay una forma de referenciar los recursos por el nombre de la clave y ponerlos en el FixedDocument con XAML, por favor avíseme. Parece que no puedo encontrar una manera de hacerlo, pero tal vez es posible.
Utilizar:
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>
Como solución, puse el DocumentViewer y la página en una grilla:
<Grid>
<FixedPage Width="21.0cm" Height="29.7cm" x:Name="uiPage1">
<TextBlock>Hello World!</TextBlock>
</FixedPage>
<DocumentViewer>
<FixedDocument x:Name="uiReport">
</FixedDocument>
</DocumentViewer>
</Grid>
Luego adjunto la página al DocumentViewer en el evento Loaded
de la ventana:
Ejemplo de 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 # ejemplo:
((Grid)uiPage1.Parent).Children.Remove(uiPage1);
var content = new PageContent();
((IAddChild)content).AddChild(uiPage1);
uiReport.Pages.Add(content);