2010-02-23 18 views
11

मेरा प्रदर्शन के विभिन्न WPF अनुप्रयोग फ़्लो डॉक्यूमेंट्स का प्रदर्शन करते हैं। मैं the answer to Printing a WPF FlowDocument में वर्णित दृष्टिकोण का उपयोग करके उन्हें मुद्रित करने में सक्षम हूं।मैं एक WPF अनुप्रयोग में फ़्लो डॉक्यूमेंट का "प्रिंट पूर्वावलोकन" कैसे बना सकता हूं?

अब मैं एक "प्रिंट पूर्वावलोकन" क्षमता जोड़ना चाहता हूं। सामान्य स्थिति में, मैं फ्लो डॉक्यूमेंट को प्रिंट कर रहा हूं जो विंडो में प्रदर्शित होता है, और इसलिए मुझे प्रिंट पूर्वावलोकन की आवश्यकता नहीं होगी। लेकिन कुछ मामलों में फ्लो डॉक्यूमेंट प्रिंट करने के लिए स्मृति में ऑन-द-फ्लाई का निर्माण किया जाता है। और इन मामलों में मैं प्रिंटिंग से पहले इसे प्रदर्शित करना चाहता हूं।

अब, मैं निश्चित रूप से एक नई विंडो पॉप और FlowDocument प्रदर्शित कर सकते हैं, लेकिन

  1. मैं करने के लिए पूर्वावलोकन चाहते हैं वास्तव में महसूस है जैसे कि यह मुद्रण आपरेशन का हिस्सा है, और न सिर्फ में एक और खिड़की अप्प।

  2. मैं FlowDocumentScrollViewer में सामान्य फ़्लो डॉक्यूमेंट नहीं चाहता हूं। "किसी भी आकार" होने के बजाय इसे कागज के आकार, एक विशिष्ट एचएक्सडब्ल्यू अनुपात, और अंकनित करने की आवश्यकता है।

सुझाव?

  • क्या मुझे बस एक मानक विंडो का उपयोग करना चाहिए, और उस स्थिति में, मैं कैसे सुनिश्चित करूं कि फ़्लो डॉक्यूमेंट उचित अनुपात पर है?

  • क्या प्रिंटडिअलॉग यूआई के दायरे में पूर्वावलोकन करने के लिए एक और अधिक "एकीकृत" तरीका है जो विंडोज का हिस्सा है?

धन्यवाद

+1

हाय चेसो के संदर्भ के रूप में जोड़ा जाना चाहिए, यह उत्तर http://stackoverflow.com/questions/584551/how-do-i-do-print-preview-when-using-a -documentpaginator-to-print/587962 # 587962 एक मानक विंडो के साथ संयुक्त XpsDocument का उपयोग करने का सुझाव देता है ... इसे एक उत्तर के रूप में लिखना नहीं चाहते हैं, क्योंकि मुझे डर है कि आप पहले से ही उस लिंक को देख चुके हैं। शायद ज़रुरत पड़े। चीयर्स :) – Anvaka

उत्तर

19

टिप्पणी से संकेत लेते हुए मेरे सवाल को जोड़ा गया है, मैं इस किया था:

private string _previewWindowXaml = 
    @"<Window 
     xmlns     ='http://schemas.microsoft.com/netfx/2007/xaml/presentation' 
     xmlns:x    ='http://schemas.microsoft.com/winfx/2006/xaml' 
     Title     ='Print Preview - @@TITLE' 
     Height    ='200' 
     Width     ='300' 
     WindowStartupLocation ='CenterOwner'> 
     <DocumentViewer Name='dv1'/> 
    </Window>"; 

internal void DoPreview(string title) 
{ 
    string fileName = System.IO.Path.GetRandomFileName(); 
    FlowDocumentScrollViewer visual = (FlowDocumentScrollViewer)(_parent.FindName("fdsv1")); 
    try 
    { 
     // write the XPS document 
     using (XpsDocument doc = new XpsDocument(fileName, FileAccess.ReadWrite)) 
     { 
      XpsDocumentWriter writer = XpsDocument.CreateXpsDocumentWriter(doc); 
      writer.Write(visual); 
     } 

     // Read the XPS document into a dynamically generated 
     // preview Window 
     using (XpsDocument doc = new XpsDocument(fileName, FileAccess.Read)) 
     { 
      FixedDocumentSequence fds = doc.GetFixedDocumentSequence(); 

      string s = _previewWindowXaml; 
      s = s.Replace("@@TITLE", title.Replace("'", "&apos;")); 

      using (var reader = new System.Xml.XmlTextReader(new StringReader(s))) 
      { 
       Window preview = System.Windows.Markup.XamlReader.Load(reader) as Window; 

       DocumentViewer dv1 = LogicalTreeHelper.FindLogicalNode(preview, "dv1") as DocumentViewer; 
       dv1.Document = fds as IDocumentPaginatorSource; 


       preview.ShowDialog(); 
      } 
     } 
    } 
    finally 
    { 
     if (File.Exists(fileName)) 
     { 
      try 
      { 
       File.Delete(fileName); 
      } 
      catch 
      { 
      } 
     } 
    } 
} 

यह क्या करता है: यह वास्तव में एक एक्सपीएस दस्तावेज़ में एक दृश्य की सामग्री के मुद्रण करता है। फिर यह "मुद्रित" एक्सपीएस दस्तावेज़ लोड करता है और इसे एक बहुत ही सरल XAML फ़ाइल में प्रदर्शित करता है जो एक अलग मॉड्यूल के बजाए स्ट्रिंग के रूप में संग्रहीत होता है, और रनटाइम पर गतिशील रूप से लोड किया जाता है। परिणामी विंडो में DocumentViewer बटन हैं: प्रिंट, एडजस्ट-टू-मैक्स-पेज-चौड़ाई, और इसी तरह।

मैंने खोज बॉक्स को छुपाने के लिए कुछ कोड भी जोड़ा। मैंने यह कैसे किया के लिए this answer to WPF: How can I remove the searchbox in a DocumentViewer? देखें।

प्रभाव इस तरह है:

alt text http://i48.tinypic.com/2hzkfat.jpg

XpsDocument ReachFramework dll में पाया जा सकता है और XpsDocumentWriter प्रणाली में पाया जा सकता।प्रिंटिंग डीएल दोनों को परियोजना

+2

मैं आपके कोड का उपयोग नहीं कर सकता क्योंकि मेरी परियोजना XpsDocument नहीं ढूंढ सका और इसे हल नहीं कर सकता। मुझे अपने प्रोजेक्ट में कौन सा संदर्भ जोड़ना है? – icaptan

+1

ReachFramework और System के लिए संदर्भ जोड़ें। Cheeso राज्यों के रूप में प्रिंटिंग, फिर System.Windows.Xps का उपयोग करके लिखें; System.Windows.Xps.Packaging का उपयोग कर; सिस्टम का उपयोग कर। प्रिंटिंग; 'शामिल करने के लिए। बिना मुद्दे के मेरा संकलन। –

+2

_parent क्या है? –

2

"FlowDocumentPageViewer" नियंत्रण हमारी परियोजनाओं में से एक में इस्तेमाल किया "पूर्वावलोकन" नियंत्रण के लिए आधार है। यहाँ "DocumentPreviewer" नियंत्रण से XAML है (लंबाई के लिए क्षमा याचना - XAML नहीं संक्षिप्त है):

<Control 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:sys="clr-namespace:System;assembly=mscorlib" 
    xmlns:l="clr-namespace:Tyler.ComPort.UI" 
    mc:Ignorable="d" 
    x:Class="Tyler.ComPort.UI.DocumentPreviewer" 
    x:Name="UserControl" 
    Background="Gray" 
    d:DesignWidth="640" d:DesignHeight="480"> 
    <Control.Resources> 
     <ObjectDataProvider x:Key="ViewStyles" MethodName="GetValues" ObjectType="{x:Type sys:Enum}" > 
      <ObjectDataProvider.MethodParameters> 
       <x:Type TypeName="l:ViewType" /> 
      </ObjectDataProvider.MethodParameters> 
     </ObjectDataProvider> 
     <l:EnumMatchVisibilityConverter x:Key="EnumVisibilityConverter" /> 
    </Control.Resources> 
    <Control.Template> 
     <ControlTemplate> 
      <ControlTemplate.Triggers> 
       <Trigger Property="l:DocumentPreviewer.ViewType"> 
        <Trigger.Value> 
         <l:ViewType>Actual</l:ViewType> 
        </Trigger.Value> 
        <Trigger.Setters> 
         <Setter TargetName="ScrollViewer" Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Auto" /> 
         <Setter TargetName="ScrollViewer" Property="ScrollViewer.VerticalScrollBarVisibility" Value="Auto" /> 
         <Setter TargetName="Viewbox" Property="Viewbox.Stretch" Value="None" /> 
        </Trigger.Setters> 
       </Trigger> 
       <Trigger Property="l:DocumentPreviewer.ViewType"> 
        <Trigger.Value> 
         <l:ViewType>Fit</l:ViewType> 
        </Trigger.Value> 
        <Trigger.Setters> 
         <Setter TargetName="ScrollViewer" Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Disabled" /> 
         <Setter TargetName="ScrollViewer" Property="ScrollViewer.VerticalScrollBarVisibility" Value="Disabled" /> 
         <Setter TargetName="Viewbox" Property="Viewbox.Stretch" Value="Uniform" /> 
        </Trigger.Setters> 
       </Trigger> 
       <Trigger Property="l:DocumentPreviewer.ViewType"> 
        <Trigger.Value> 
         <l:ViewType>Wide</l:ViewType> 
        </Trigger.Value> 
        <Trigger.Setters> 
         <Setter TargetName="ScrollViewer" Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Disabled" /> 
         <Setter TargetName="ScrollViewer" Property="ScrollViewer.VerticalScrollBarVisibility" Value="Auto" /> 
         <Setter TargetName="Viewbox" Property="Viewbox.Stretch" Value="UniformToFill" /> 
        </Trigger.Setters> 
       </Trigger> 
      </ControlTemplate.Triggers> 
      <DockPanel> 
       <ToolBar DockPanel.Dock="Top"> 
        <Button Command="{x:Static ApplicationCommands.Print}" CommandTarget="{Binding ElementName=PageViewer}" Content="Print..." /> 
        <Separator /> 
        <Button Command="{x:Static NavigationCommands.PreviousPage}" CommandTarget="{Binding ElementName=PageViewer}" Content="&lt; Previous" /> 
        <Button Command="{x:Static NavigationCommands.NextPage}" CommandTarget="{Binding ElementName=PageViewer}" Content="Next &gt;" /> 
        <Separator /> 
        <l:ToolBarButtonGroup 
         ItemsSource="{Binding Source={StaticResource ViewStyles}}" 
         SelectedItem="{Binding ViewType, ElementName=UserControl}" 
         IsSynchronizedWithCurrentItem="True" 
         > 
         <l:ToolBarButtonGroup.ItemTemplate> 
          <DataTemplate> 
           <StackPanel Orientation="Horizontal" ToolTip="{Binding}" SnapsToDevicePixels="True"> 
            <Image Source="../Images/actual.png" Visibility="{Binding Converter={StaticResource EnumVisibilityConverter}, ConverterParameter=Actual}" /> 
            <Image Source="../Images/fit.png" Visibility="{Binding Converter={StaticResource EnumVisibilityConverter}, ConverterParameter=Fit}" /> 
            <Image Source="../Images/wide.png" Visibility="{Binding Converter={StaticResource EnumVisibilityConverter}, ConverterParameter=Wide}" /> 
           </StackPanel> 
          </DataTemplate> 
         </l:ToolBarButtonGroup.ItemTemplate> 
        </l:ToolBarButtonGroup> 
       </ToolBar> 
       <ScrollViewer x:Name="ScrollViewer" HorizontalScrollBarVisibility="Disabled" VerticalScrollBarVisibility="Disabled"> 
        <Border 
          BorderBrush="Black" 
          BorderThickness="1" 
          HorizontalAlignment="Center" 
          VerticalAlignment="Top" 
          Background="White" 
          Margin="10"> 
         <Viewbox x:Name="Viewbox" Stretch="Uniform"> 
          <FlowDocumentPageViewer 
           x:Name="PageViewer" 
           Document="{Binding Document, ElementName=UserControl}" 
           Zoom="100" 
           MinZoom="20" 
           MaxZoom="200"> 
           <FlowDocumentPageViewer.Template> 
            <ControlTemplate TargetType="{x:Type FlowDocumentPageViewer}"> 
             <AdornerDecorator> 
              <DocumentPageView FlowDocumentPageViewer.IsMasterPage="True" /> 
             </AdornerDecorator> 
            </ControlTemplate> 
           </FlowDocumentPageViewer.Template> 
          </FlowDocumentPageViewer> 
         </Viewbox> 
        </Border> 
       </ScrollViewer> 
      </DockPanel> 
     </ControlTemplate> 
    </Control.Template> 
</Control> 

कहाँ आप इस तरह के एक नियंत्रण डाल सकता है निश्चित रूप से आप (और अपने अनुप्रयोग) पर निर्भर है, लेकिन हमारे ऐप के सामान्य कार्यालय ऐप के समान व्यवहार होता है जहां आप या तो सीधे प्रिंट या पूर्वावलोकन कर सकते हैं (जो उपर्युक्त इंटरफ़ेस दिखाता है) और वहां से प्रिंट करें।

+0

निश्चित रूप से दिलचस्प है, लेकिन मैं उस कोड को स्वामित्व और प्रबंधित नहीं करना चाहता! मैं एक आसान तरीका की उम्मीद कर रहा था। यहां बताया गया है कि मैंने यह कैसे किया: http://stackoverflow.com/questions/2322064/how-can-i-produce-a-print-preview-of-a-flowdocument-in-a-wpf-application/2322751#2322751 – Cheeso

संबंधित मुद्दे