2017-04-16 1 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 표기법을 사용하여 상대 URI를 사용하는 경우 XAML에서이 공식이 제대로 작동하지만 "이미지를 찾을 수 없음"이벤트가 발생합니다.

그래서 여기서 어떻게됩니까? 내가 언급 한 질문에 따르면, 문제는 화면에 나타날 때까지 이미지가로드되지 않는다는 것입니다. 이것이 사실이라면 절대 URI 경로가 작동하는 이유는 무엇입니까? 프로그래밍 방식과 달리 XAML에서 이미지 소스가 작동하는 방식이 다른 점은 무엇입니까?

+0

enter image description here은 사용하려고 했습니까; 상대방이 옳지 않은 것처럼 보입니다. –

답변

0

이미지를 찾을 수 있음을 나타내는 ResourceDirectonary을 통해 이미지를 참조 할 수 있었기 때문에.

BuildAction="Resource"을 사용하여 이미지를 프로젝트에 추가했다고 가정합니다.

이 특정 라인을 보면 UriKind.Absolute 대신 실수로 UriKind.Relative을 사용했다고 생각합니다.

실제로는 Uri 문자열이 "pack : //"다양성 인 것처럼 두 번째 UriKind 매개 변수를 사용하지 않아도되며, 상대 또는 절대 여부가 로케이터에 인코딩됩니다. 또는 문자열에 접두사 "/"가 있으면 "절대"를 의미하지만 다른 것은 일반적으로 상대적인 것입니다. "./", "../"등을 사용하여 원하는 경우 더 분명 할 수 있습니다.

(달리 해석하지 않는 한, 어떤 일을 한 것 같아서 ... 작동하지 않는 이유입니다). 사용에 도우미로

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

"팩 : //"URI는 이미지를 참조하는 ...나는 당신이 gotchas 중 하나를 쳤을 경우에 대비하여 다른 조합을 보여주기위한 매트릭스를 생각해 냈습니다.

여기에는 리소스를 애플리케이션에 어떻게 제공했는지, 리소스를 참조하는 방법 (모든 옵션이 아님)에 따라 이미지 "리소스"를 참조하는 몇 가지 조합이 표시됩니다.

4 개의 이미지가 만들어지고 "project"노드 바로 아래에 파일로 image1.bmp, image2.bmp, image3.bmp, image4.bmp가 추가됩니다. 빌드 동작은 4 가지 다른 값으로 설정됩니다.

"이미지"를 참조하는 여러 가지 방법을 살펴 봅니다. 새로운 열린 우리당 ("팩 : // 응용 프로그램 : ,,,/이미지/globe.png", UriKind.Absolute를)

<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"폴더의 이미지를 찾고 있습니다. (현재 디렉토리는 더블 클릭하여 EXE를 응용 프로그램을 시작하면 EXE가 상주하는 폴더입니다)를 팩 URI 양식

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

이 상대, 절대 아니다 들어

new Uri("Images/globe.png", UriKind.Relative); 

. this을 참조하십시오.

관련 문제