我正在努力让图像显示在打印为PDF,XPS或打印机的FlowDocument中。
我研究了这个问题Missing images in FlowDocument saved as XPS document,但发现答案不尽如人意。
这是我的代码......
PrintDialog pd = new PrintDialog();
if(pd.ShowDialog() == true)
{
FlowDocument fd = new FlowDocument();
fd.Blocks.Add(new Paragraph(new Run("Line 1")));
Uri uri = new Uri("Images/globe.png", UriKind.Relative);
// Uri uri = new Uri(@"C:\...\Images\globe.png", UriKind.Absolute);
// Uri uri = new Uri("pack://application:,,,/Images/globe.png", UriKind.Relative);
BitmapImage bi = new BitmapImage(uri);
Image i = new Image();
i.Height = 20;
i.Width = 20;
i.Source = bi;
// Image i = this.Resources["globeImage"] as Image;
fd.Blocks.Add(new BlockUIContainer(i));
fd.Blocks.Add(new Paragraph(new Run("Line 2")));
pd.PrintDocument((fd as IDocumentPaginatorSource).DocumentPaginator, "A print document");
}
另外,我已经定义了这个资源......
<Image x:Key="globeImage" Source="Images/globe.png" Height="20" Width="20"/>
因此,显示的代码不起作用。这个地方的图像应该在打印文件中是空白的。
这是有趣的地方......
如果我使用绝对uri,则会出现图像。 如果我使用windows资源中定义的图像,则会出现图像。 如果我使用包含uri符号的相对uri,我会得到一个例外:“找不到图像”,虽然此公式在XAML中可以正常工作。
那么这里发生了什么?根据我引用的问题,问题是图像直到屏幕上显示才加载。如果这是真的,那么为什么绝对URI路径有效?有关图像源在XAML中的工作方式与编程方式有何不同。
答案 0 :(得分:1)
对于以下表单,应用程序在相对于当前目录的“Images”文件夹中查找图像,该文件夹不存在。 (如果通过双击exe启动应用程序,则当前目录是exe所在的文件夹)
new Uri("Images/globe.png", UriKind.Relative);
对于Pack URI表单
pack://application:,,,/Images/globe.png
这是绝对的,而不是相对的。请参阅this。
答案 1 :(得分:0)
由于您可以通过ResourceDirectonary
引用您的图片,这表明您的图片可以找到。
假设您使用BuildAction="Resource"
将图片添加到项目中。
查看此特定行,我认为您错误地使用了UriKind.Relative
而不是UriKind.Absolute
。
事实上,通常不需要使用第二个UriKind
参数,就像您的Uri
字符串属于&#34; pack://&#34;变量,然后它是相对的还是绝对的在编码器中编码...或者如果你的字符串有一个&#34; /&#34;前缀这将暗示&#34;绝对&#34;而其他任何东西通常都是相对的.......如果你想使用&#34; ./",&#34; ../"等等,你可以更加明显。
(除非你告诉它另外解释,这就是你似乎已经做过的......这就是为什么它不起作用)。
// Uri uri = new Uri("pack://application:,,,/Images/globe.png", UriKind.Relative);
作为帮助使用&#34; pack://&#34; uris参考图像......我已经想出了一个矩阵来展示一些不同的组合,以防你遇到其中一个问题。
这显示了一些参考图像的不同组合&#34;资源&#34;取决于您如何向应用程序提供该资源以及如何引用它(它不是所有选项)。
创建了4个图像,并将其添加为:image1.bmp,image2.bmp,image3.bmp,image4.bmp,作为文件直接在&#34;项目&#34;节点。构建操作设置为4个不同的值。
然后介绍&#34;图像的一些不同方式&#34;正在探索。
<Window x:Class="WpfApplication4.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="600" Width="1200">
<Window.Resources>
<Style TargetType="{x:Type TextBlock}">
<Setter Property="Margin" Value="4"/>
<Setter Property="FontSize" Value="14"/>
</Style>
<BitmapImage x:Key="bitmap1" UriSource="Image1.bmp"/>
<BitmapImage x:Key="bitmap2" UriSource="Image2.bmp"/>
<BitmapImage x:Key="bitmap3" UriSource="Image3.bmp"/>
<BitmapImage x:Key="bitmap4" UriSource="Image4.bmp"/>
<Image x:Key="image1" Source="Image1.bmp"/>
<Image x:Key="image2" Source="Image2.bmp"/>
<Image x:Key="image3" Source="Image3.bmp"/>
<Image x:Key="image4" Source="Image4.bmp"/>
</Window.Resources>
<Grid ShowGridLines="True">
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
<ColumnDefinition/>
<ColumnDefinition/>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
<RowDefinition/>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<TextBlock Background="LightYellow" Grid.Column="0" Grid.Row="1">BuildAction=<LineBreak/>"Resource"</TextBlock>
<TextBlock Background="LightYellow" Grid.Column="0" Grid.Row="2">BuildAction=<LineBreak/>"Embedded Resource"</TextBlock>
<TextBlock Background="LightYellow" Grid.Column="0" Grid.Row="3">BuildAction=<LineBreak/>"Content"</TextBlock>
<TextBlock Background="LightYellow" Grid.Column="0" Grid.Row="4">BuildAction=<LineBreak/>"Content (copied to output)"</TextBlock>
<TextBlock Background="PeachPuff" Grid.Column="1" Grid.Row="0">pack://application:,,,/</TextBlock>
<TextBlock Background="PeachPuff" Grid.Column="2" Grid.Row="0">pack://application:,,,/WpfApplication4;component/</TextBlock>
<TextBlock Background="PeachPuff" Grid.Column="3" Grid.Row="0">pack://siteoforigin:,,,/</TextBlock>
<TextBlock Background="PeachPuff" Grid.Column="4" Grid.Row="0">Image<LineBreak/>referencing BitmapImage<LineBreak/>via {StaticResource}<LineBreak/>referencing "Resource"</TextBlock>
<TextBlock Background="PeachPuff" Grid.Column="5" Grid.Row="0">ContentPresenter<LineBreak/>referencing Image<LineBreak/>via {StaticResource}<LineBreak/>referencing "Resource"</TextBlock>
<Image Grid.Column="1" Grid.Row="1" Source="pack://application:,,,/Image1.bmp"/>
<Image Grid.Column="1" Grid.Row="2" Source="pack://application:,,,/Image2.bmp"/>
<Image Grid.Column="1" Grid.Row="3" Source="pack://application:,,,/Image3.bmp"/>
<Image Grid.Column="1" Grid.Row="4" Source="pack://application:,,,/Image4.bmp"/>
<Image Grid.Column="2" Grid.Row="1" Source="pack://application:,,,/WpfApplication4;component/Image1.bmp"/>
<Image Grid.Column="2" Grid.Row="2" Source="pack://application:,,,/WpfApplication4;component/Image2.bmp"/>
<Image Grid.Column="2" Grid.Row="3" Source="pack://application:,,,/WpfApplication4;component/Image3.bmp"/>
<Image Grid.Column="2" Grid.Row="4" Source="pack://application:,,,/WpfApplication4;component/Image4.bmp"/>
<Image Grid.Column="3" Grid.Row="1" Source="pack://siteoforigin:,,,/Image1.bmp"/>
<Image Grid.Column="3" Grid.Row="2" Source="pack://siteoforigin:,,,/Image2.bmp"/>
<Image Grid.Column="3" Grid.Row="3" Source="pack://siteoforigin:,,,/Image3.bmp"/>
<Image Grid.Column="3" Grid.Row="4" Source="pack://siteoforigin:,,,/Image4.bmp"/>
<Image Grid.Column="4" Grid.Row="1" Source="{StaticResource bitmap1}"/>
<Image Grid.Column="4" Grid.Row="2" Source="{StaticResource bitmap2}"/>
<Image Grid.Column="4" Grid.Row="3" Source="{StaticResource bitmap3}"/>
<Image Grid.Column="4" Grid.Row="4" Source="{StaticResource bitmap4}"/>
<ContentPresenter Grid.Column="5" Grid.Row="1" Content="{StaticResource image1}"/>
<ContentPresenter Grid.Column="5" Grid.Row="2" Content="{StaticResource image2}"/>
<ContentPresenter Grid.Column="5" Grid.Row="3" Content="{StaticResource image3}"/>
<ContentPresenter Grid.Column="5" Grid.Row="4" Content="{StaticResource image4}"/>
</Grid>
</Window>