2017-04-16 5 views
0

PDF、XPS、またはプリンタに出力されるFlowDocumentに画像が表示されるのを苦労しています。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をpack uri表記で使用すると、例外が発生します。「画像が見つかりません」というイベントですが、この形式はXAMLで正常に機能します。

ここでは何が起こっていますか?私が参照した質問によると、画面に表示されるまでイメージが読み込まれないという問題があります。これが当てはまる場合、絶対URIパスはなぜ機能しますか?プログラムではなく、XAMLで画像ソースがどのように動作するかについては何が違うのですか。

+0

あなたが使用してみました:新しいウリ( "パック://アプリケーション:,,, /画像/ globe.png"、UriKind.Absoluteを)。 ?... Relativeは正しいように見えません。 –

答えて

0

ResourceDirectonaryであなたの画像を参照できるようになり、あなたの画像を見つけることができるようになりました。

BuildAction="Resource"を使用して画像をプロジェクトに追加したと仮定します。

この特定の行を見ると、UriKind.Absoluteの代わりにUriKind.Relativeを間違えて使用したと思います。

実際にはUri文字列が "pack://"バラエティであるかのように、その第2のUriKindパラメータを使用する必要は通常ありません。次に、相対または絶対値のどちらがロケータでエンコードされているか... ifあなたの文字列には "/"接頭辞が付いています。これは "絶対"を意味しますが、他のものは通常相対的なものです... "./"、 "../"などを使いたい場合はもっと明白です。

(そうしないと解釈しない限り、これはあなたがしたように見えます...それが働いていない理由です)。 "パック://" を使用してのヘルパーとして

//    Uri uri = new Uri("pack://application:,,,/Images/globe.png", UriKind.Relative); 

画像を参照するためにURIを...私はあなたが邪魔になった場合に備えて、さまざまな組み合わせのいくつかを表示するためのマトリックスを用意しました。

これは、リソースをアプリケーションにどのように提供するか、どのように参照するかによってイメージ "リソース"を参照するいくつかの異なる組み合わせを示しています(すべてのオプションではありません)。

4つのイメージが作成され、 "project"ノードの直下のファイルとしてimage1.bmp、image2.bmp、image3.bmp、image4.bmpのように追加されました。ビルドアクションは4つの異なる値に設定されています。

「画像」を参照するさまざまな方法がいくつか検討されています。

enter image description here

<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> 
1

以下の形式の場合、アプリケーションは存在しないカレントディレクトリを基準にして "Images"フォルダ内のイメージを探しています。

new Uri("Images/globe.png", UriKind.Relative); 
パックURI形式の場合

pack://application:,,,/Images/globe.png 

(カレントディレクトリは、二重のexeファイルをクリックしてアプリケーションを起動した場合exeファイルが存在するフォルダです)これは、相対、絶対的ではありません。 thisを参照してください。

関連する問題