Limitaciones del RDL
que originalmente fue con RDLC/ReportViewer para imprimir con WPF, pero lo encontraron muy limitante. Algunas de las limitaciones que encontré fueron:
- RDL sólo podía crear el más aburrido de los informes
- era mucho más trabajo para crear un informe mediante el RDL que en WPF recta: Las herramientas de diseño son muy primitivas en comparación con Expression Blend y ofertas RDL solamente en cuadros
- no tenía la capacidad de utilizar ControlTemplates, DataTemplates, estilos, etc
- Mi informe campos y columnas no podía cambiar el tamaño y reorganizar de manera efectiva en función del tamaño de datos
- Gráficos tenía para ser importado como imágenes - no pudo b e dibujado o editados como vectores
- Posicionamiento de los elementos necesarios de código subyacente en lugar de unión a
- La falta de transformaciones de datos
- vinculantes
Impresión directa desde WPF datos muy primitiva es muy fácil
Debido a estas limitaciones busqué crear informes usando WPF puro y descubrí que era realmente bastante trivial. WPF le permite implementar su propia subclase DocumentPaginator
que puede generar páginas.
Desarrollé una subclase DocumentPaginator simple que toma cualquier Visual, analiza el árbol visual y oculta los elementos seleccionados para crear cada página.
detalles DocumentPaginator
Esto es lo que hace mi DocumentPaginator subclase durante la inicialización (llamados cuando primero PageCount es capturada, o durante el primer getPage() llamada):
- Escanea el árbol visual y crea un mapa de todos los paneles desplazados dentro de ItemsControls
- Empezando por el más externo, hace que los elementos en los ItemsControls sean invisibles hasta que el Visual se ajuste a una sola página sin necesidad de desplazarse. Si el más externo no se puede reducir lo suficiente, reduce los paneles internos hasta que tenga éxito o solo tenga un elemento en cada nivel. Registre el conjunto de elementos visibles como la primera página.
- Oculte los elementos de nivel más bajo que ya se han mostrado en la primera página, luego haga visibles los elementos subsiguientes hasta que ya no quepan en la página. Grabe todo, excepto el último elemento agregado como la segunda página.
- Repita el proceso para todas las páginas, almacenando los resultados en una estructura de datos.
método getPage de mi DocumentPaginator es el siguiente:
- Busque el número de página que figura en la estructura de datos generados durante la inicialización
- Ocultar y mostrar elementos en el árbol visual como se indica en la estructura de datos
propiedades
- Conjunto PageNumber y NumberOfPages adjuntos lo que el informe puede mostrar la página de numeración
- a eliminar el despachador (
Dispatcher.BeginInvoke(DispatcherPriority.ApplicationIdle, new Action(() => {}));
) para conseguir cualquier tarea en segundo plano de representación s para completar
- crear un rectángulo del tamaño de la página cuyo VisualBrush es el ser visual impresa
- Medida, organizar y UpdateLayout del rectángulo, después lo devuelve
Esto resultó ser un código muy sencillo , y me permitió convertir prácticamente todo lo que pudiera crear con WPF en páginas e imprimirlo.
apoyo adicional de informes
Ahora que mi paginador está trabajando, ya no tienen que preocuparse mucho acerca de si estoy creando mi contenido de WPF para la pantalla o papel. De hecho, a menudo la interfaz de usuario que construyo para la entrada y edición de datos también funciona muy bien para la impresión.
A partir de ahí agregué una barra de herramientas simple y un código detrás, lo que resultó en un sistema completo de creación de informes basado en WPF que era mucho más capaz que RDL. Mi código de informe puede exportar a archivos, imprimir a la impresora, cortar/pegar imágenes de página y cortar/pegar datos para Excel. También puedo cambiar cualquiera de mi interfaz de usuario a "vista de impresión" con un clic en una casilla de verificación para ver cómo se verá si se imprime. ¡Todo esto en solo unos cientos de líneas de C# y XAML!
En este momento, creo que la única característica RDL que tiene mi código de informe no es la capacidad de generar una hoja de cálculo Excel formateada. Puedo ver cómo se podría hacer esto, pero hasta ahora no ha sido necesario, cortar y pegar solo los datos ha sido suficiente.
Desde mi experiencia, mi recomendación sería escribir un paginador, luego comenzar a usar WPF para crear sus informes.
[SimpleWPFReporting] (https://github.com/maximcus/SimpleWPFReporting) le da la capacidad de crear cualquier informe con toda la potencia de WPF XAML. SimpleWPFReporting se ocupará de exportarlo como PDF o imprimirlo. –