Добавление изображения в FixedPage в WPF
Я хочу иметь возможность печатать изображения с другими элементами UIE. У меня есть экземпляр FixedPage и пытаюсь добавить изображение так
// Basic printing stuff
var printDialog = new PrintDialog();
var fixedDocument = new FixedDocument();
fixedDocument.DocumentPaginator.PageSize = new Size(printDialog.PrintableAreaWidth, printDialog.PrintableAreaHeight);
FixedPage page = new FixedPage();
page.Width = fixedDocument.DocumentPaginator.PageSize.Width;
page.Height = fixedDocument.DocumentPaginator.PageSize.Height;
Image img = new Image();
// PrintIt my project's name, Img folder
var uriImageSource = new Uri(@"/PrintIt;component/Img/Stuff.png", UriKind.RelativeOrAbsolute);
img.Source = new BitmapImage(uriImageSource);
img.Width = 100;
img.Height = 100;
page.Children.Add(img);
PageContent pageContent = new PageContent();
((IAddChild)pageContent).AddChild(page);
fixedDocument.Pages.Add(pageContent);
// Print me an image please!
_printDialog.PrintDocument(fixedDocument.DocumentPaginator, "Print");
Это дает мне чистый лист бумаги. Мне интересно, почему, потому что другие элементы UIE (такие как TextBox, Grid, Rect) появляются без проблем. Что мне не хватает?
Спасибо!
PS ОК, я нашел другое решение. Я не знаю почему, но с этим Ури картинка загружается правильно
var uri = new Uri("pack://application:,,,/Img/Stuff.png");
2 ответа
Чтобы быть более понятным в моем коде
var bitImage = new BitmapImage();
bitImage.BeginInit();
bitImage.StreamSource = new FileStream(fileName, FileMode.Open, FileAccess.Read);
bitImage.DecodePixelWidth = 250;
bitImage.CacheOption = BitmapCacheOption.OnLoad;
bitImage.CreateOptions = BitmapCreateOptions.IgnoreColorProfile;
bitImage.EndInit();
bitImage.StreamSource.Seek(0, System.IO.SeekOrigin.Begin);
bitImage.Freeze();
var tempImage = new Image {Source = bitImage};
var imageObject = new ImageObject(tempImage, fileName);
bitImage.StreamSource.Dispose();
page.Children.Add(imageObject);
Сначала я хотел бы предложить это, см. Ниже.
Set the sourceStream of the Image for BitMap
bitImage.StreamSource = new FileStream(fileName, FileMode.Open, FileAccess.Read);
Затем заморозьте изображение BitMap, иначе оно не будет отображаться в качестве изображения, которое можно отобразить.
bitImage.StreamSource.Seek(0, System.IO.SeekOrigin.Begin);
bitImage.Freeze();
Это должно сработать, если нет, лично я считаю плохой идеей работать напрямую с BitMaps, я использую Bitmap для создания файла формы изображения, затем копирую его в тип Image(system.drawing iguess), что-то вроде ниже
var tempImage = new Image {Source = bitImage};
var imageObject = new ImageObject(tempImage, fileName);
bitImage.StreamSource.Dispose();
это временное изображение может быть добавлено к вашей странице как обычный UIElement. Надеюсь, поможет.