Anpassen des Druck-WorkflowsCustomize the print workflow

ÜbersichtOverview

Entwickler können die Druck Workflow-Darstellung durch die Verwendung einer Druckworkflow-App anpassen.Developers can customize the printing workflow experience through the use of a print workflow app. Beim Drucken von Workflow-apps handelt es sich um UWP-apps, die auf die Funktionen von Microsoft Store Geräte-Apps (wsdas)erweitert werden. Daher ist es hilfreich, sich vor dem Fortfahren mit wsdas vertraut zu machen.Print workflow apps are UWP apps that expand on the functionality of Microsoft Store devices apps (WSDAs), so it will be helpful to have some familiarity with WSDAs before going further.

Wie im Fall von wsdas überprüft das System, wenn der Benutzer einer Quell Anwendung einen Text ausgeben und durch das Dialogfeld "Drucken" navigiert, ob eine Workflow-app mit diesem Drucker verknüpft ist.Just as in the case of WSDAs, when the user of a source application elects to print something and navigates through the print dialog, the system checks whether a workflow app is associated with that printer. Wenn dies der Fall ist, wird die Druck Workflow-app gestartet (hauptsächlich als Hintergrundaufgabe; Weitere Informationen hierzu finden Sie weiter unten).If it is, the print workflow app launches (primarily as a background task; more on this below). Eine Workflow-app kann sowohl das Druck Ticket (das XML-Dokument, das die Geräteeinstellungen des Druckers für die aktuelle Druck Aufgabe konfiguriert) als auch den eigentlichen XPS-Inhalt ändern, der gedruckt werden soll.A workflow app is able to alter both the print ticket (the XML document that configures the printer device settings for the current print task) and the actual XPS content to be printed. Diese Funktion kann dem Benutzer optional zugänglich gemacht werden, indem eine Benutzeroberfläche in der Mitte des Prozesses gestartet wird.It can optionally expose this functionality to the user by launching a UI midway through the process. Nachdem die Arbeit ausgeführt wurde, übergibt Sie den Druck Inhalt und das Druck Ticket an den Treiber.After doing its work, it passes the print content and print ticket on to the driver.

Da Sie Hintergrund-und Vordergrund Komponenten umfasst und funktionell mit anderen apps verbunden ist, kann eine Druck Workflow-app komplizierter zu implementieren sein als andere Kategorien von UWP-apps.Because it involves background and foreground components, and because it is functionally coupled with other app(s), a print workflow app can be more complicated to implement than other categories of UWP apps. Es wird empfohlen, das Workflow- App-Beispiel zu überprüfen, während Sie dieses Handbuch lesen, um besser zu verstehen, wie die verschiedenen Funktionen implementiert werden können.It is recommended that you inspect the Workflow app sample while reading this guide to better understand how the different features can be implemented. Einige Features, wie z. b. verschiedene Fehlerüberprüfungen und die Benutzeroberflächen Verwaltung, sind aus Gründen der Einfachheit nicht in diesem Handbuch enthalten.Some features, such as various error checks and UI management, are absent from this guide for the sake of simplicity.

Erste SchritteGetting started

Die Workflow-app muss den Einstiegspunkt für das Drucksystem angeben, damit Sie zum richtigen Zeitpunkt gestartet werden kann.The workflow app must indicate its entry point to the print system so that it can be launched at the appropriate time. Dies erfolgt durch Einfügen der folgenden Deklaration in das Application/Extensions -Element der Datei " Package. appxmanifest " des UWP-Projekts.This is done by inserting the following declaration in the Application/Extensions element of the UWP project's package.appxmanifest file.

<uap:Extension Category="windows.printWorkflowBackgroundTask"  
    EntryPoint="WFBackgroundTasks.WfBackgroundTask" />

Wichtig

Es gibt viele Szenarien, in denen die Druckanpassung keine Benutzereingaben erfordert.There are many scenarios in which the print customization does not require user input. Aus diesem Grund werden Workflow-apps drucken als Hintergrundaufgaben standardmäßig ausgeführt.For this reason, Print workflow apps run as background tasks by default.

Wenn eine Workflow-app mit der Quell Anwendung verknüpft ist, die den Druckauftrag gestartet hat (Weitere Informationen finden Sie weiter unten in diesem Abschnitt), überprüft das Drucksystem seine Manifest-Dateien auf einen Einstiegspunkt für den Hintergrund Task.If a workflow app is associated with the source application that started the print job (see later section for instructions on this), the print system examines its manifest files for a background task entry point.

Hintergrundarbeit mit dem Druck TicketDo background work on the print ticket

Der erste Schritt, den das Drucksystem mit der Workflow-app durchführt, ist die Aktivierung der Hintergrundaufgabe (in diesem Fall die- WfBackgroundTask Klasse im- WFBackgroundTasks Namespace).The first thing the print system does with the workflow app is activate its background task (In this case, the WfBackgroundTask class in the WFBackgroundTasks namespace). In der-Methode der Hintergrundaufgabe Run sollten Sie die triggerdetails der Aufgabe als printworkflowtriggerdetails -Instanz umwandeln.In the background task's Run method, you should cast the task's trigger details as a PrintWorkflowTriggerDetails instance. Dadurch wird die besondere Funktionalität für einen Hintergrund Task für den Druck Workflow bereitgestellt.This will provide the special functionality for a print workflow background task. Sie macht die printworkflowsession -Eigenschaft verfügbar, bei der es sich um eine Instanz von printworkflowbackgroundsession handelt.It exposes the PrintWorkflowSession property, which is an instance of PrintWorkFlowBackgroundSession. Workflow-Sitzungs Klassen drucken: sowohl die Hintergrund-als auch die Vorder Grundsorte: Steuern die sequenziellen Schritte der Druck Workflow-app.Print workflow session classes - both the background and foreground varieties - will control the sequential steps of the print workflow app.

Registrieren Sie dann Handlermethoden für die beiden Ereignisse, die von dieser Sitzungs Klasse erhoben werden.Then register handler methods for the two events that this session class will raise. Diese Methoden werden später definiert.You will define these methods later on.

public void Run(IBackgroundTaskInstance taskInstance) {
    // Take out a deferral here and complete once all the callbacks are done
    runDeferral = taskInstance.GetDeferral();

    // Associate a cancellation handler with the background task.
    taskInstance.Canceled += new BackgroundTaskCanceledEventHandler(OnCanceled);

    // cast the task's trigger details as PrintWorkflowTriggerDetails
    PrintWorkflowTriggerDetails workflowTriggerDetails = taskInstance.TriggerDetails as PrintWorkflowTriggerDetails;

    // Get the session manager, which is unique to this print job
    PrintWorkflowBackgroundSession sessionManager = workflowTriggerDetails.PrintWorkflowSession;

    // add the event handler callback routines
    sessionManager.SetupRequested += OnSetupRequested;
    sessionManager.Submitted += OnXpsOMPrintSubmitted;

    // Allow the event source to start
    // This call blocks until all of the workflow callbacks complete
    sessionManager.Start();
}

Wenn die- Start Methode aufgerufen wird, gibt der Sitzungs-Manager zuerst das setuprequraise -Ereignis aus.When the Start method is called, the session manager will raise the SetupRequested event first. Dieses Ereignis macht allgemeine Informationen über die Druck Aufgabe sowie das Druck Ticket verfügbar.This event exposes general information about the print task, as well as the print ticket. Zu diesem Zeitpunkt kann das Druck Ticket im Hintergrund bearbeitet werden.At this stage, the print ticket can be edited in the background.

private void OnSetupRequested(PrintWorkflowBackgroundSession sessionManager, PrintWorkflowBackgroundSetupRequestedEventArgs printTaskSetupArgs) {
    // Take out a deferral here and complete once all the callbacks are done
    Deferral setupRequestedDeferral = printTaskSetupArgs.GetDeferral();

    // Get general information about the source application, print job title, and session ID
    string sourceApplicationName = printTaskSetupArgs.Configuration.SourceAppDisplayName;
    string jobTitle = printTaskSetupArgs.Configuration.JobTitle;
    string sessionId = printTaskSetupArgs.Configuration.SessionId;

    // edit the print ticket
    WorkflowPrintTicket printTicket = printTaskSetupArgs.GetUserPrintTicketAsync();

    // ...

Wichtig ist, dass es sich bei der Behandlung von setuprequors handelt, dass die APP bestimmt, ob eine Vordergrund Komponente gestartet werden soll.Importantly, it is in the handling of the SetupRequested that the app will determine whether to launch a foreground component. Dies kann abhängig von einer Einstellung sein, die zuvor im lokalen Speicher gespeichert wurde, oder einem Ereignis, das während der Bearbeitung des Druck Tickets aufgetreten ist, oder es kann eine statische Einstellung Ihrer speziellen APP sein.This could depend on a setting that was previously saved to local storage, or an event that occurred during the editing of the print ticket, or it may be a static setting of your particular app.

// ...

if (UIrequested) {
    printTaskSetupArgs.SetRequiresUI();

    // Any data that is to be passed to the foreground task must be stored the app's local storage.
    // It should be prefixed with the sourceApplicationName string and the SessionId string, so that
    // it can be identified as pertaining to this workflow app session.
}

// Complete the deferral taken out at the start of OnSetupRequested
setupRequestedDeferral.Complete();

Aufgaben im Vordergrund für den Druckauftrag ausführen (optional)Do foreground work on the print job (optional)

Wenn die setrequiresui -Methode aufgerufen wurde, untersucht das Drucksystem die Manifestressource auf den Einstiegspunkt der Vordergrund Anwendung.If the SetRequiresUI method was called, then the print system will examine the manifest file for the entry point to the foreground application. Das- Application/Extensions Element der Datei " Package. appxmanifest " muss über die folgenden Zeilen verfügen.The Application/Extensions element of your package.appxmanifest file must have the following lines. Ersetzen Sie den Wert von EntryPoint durch den Namen der Vordergrund-app.Replace the value of EntryPoint with name of the foreground app.

<uap:Extension Category="windows.printWorkflowForegroundTask"  
    EntryPoint="MyWorkFlowForegroundApp.App" />

Als nächstes Ruft das Drucksystem die onaktivierte Methode für den angegebenen app-Einstiegspunkt auf.Next, the print system calls the OnActivated method for the given app entry point. In der onaktivierten -Methode der app.XAML.cs -Datei sollte die Workflow-app die Aktivierungs Art überprüfen, um zu überprüfen, ob es sich um eine Workflow Aktivierung handelt.In the OnActivated method of its App.xaml.cs file, the workflow app should check the activation kind to verify that it is a workflow activation. Wenn dies der Fall ist, kann die Workflow-app die Aktivierungs Argumente in ein printworkflowuiactivatedeventargs -Objekt umwandeln, das ein printworkflowforegroundsession -Objekt als Eigenschaft verfügbar macht.If so, the workflow app can cast the activation arguments to a PrintWorkflowUIActivatedEventArgs object, which exposes a PrintWorkflowForegroundSession object as a property. Dieses Objekt enthält, wie das zugehörige Hintergrund Pendant im vorherigen Abschnitt, Ereignisse, die vom Drucksystem ausgelöst werden, und Sie können diesen Handlern zuweisen.This object, like its background counterpart in the previous section, contains events that are raised by the print system, and you can assign handlers to these. In diesem Fall wird die Ereignis Behandlungs Funktion in einer separaten Klasse namens implementiert WorkflowPage .In this case, the event-handling functionality will be implemented in a separate class called WorkflowPage.

Zuerst in der Datei app.XAML.cs :First, in the App.xaml.cs file:

protected override void OnActivated(IActivatedEventArgs args){

    if (args.Kind == ActivationKind.PrintWorkflowForegroundTask) {

        // the app should instantiate a new UI view so that it can properly handle the case when
        // several print jobs are active at the same time.
        Frame rootFrame = new Frame();
        if (null == Window.Current.Content)
        {
            rootFrame.Navigate(typeof(WorkflowPage));
            Window.Current.Content = rootFrame;
        }

        // Get the main page
        WorkflowPage workflowPage = (WorkflowPage)rootFrame.Content;

        // Make sure the page knows it's handling a foreground task activation
        workflowPage.LaunchType = WorkflowPage.WorkflowPageLaunchType.ForegroundTask;

        // Get the activation arguments
        PrintWorkflowUIActivatedEventArgs printTaskUIEventArgs = args as PrintWorkflowUIActivatedEventArgs;

        // Get the session manager
        PrintWorkflowForegroundSession taskSessionManager = printTaskUIEventArgs.PrintWorkflowSession;

        // Add the callback handlers - these methods are in the workflowPage class
        taskSessionManager.SetupRequested += workflowPage.OnSetupRequested;
        taskSessionManager.XpsDataAvailable += workflowPage.OnXpsDataAvailable;

        // start raising the print workflow events
        taskSessionManager.Start();
    }
}

Sobald die Benutzeroberfläche über angefügte Ereignishandler verfügt und die onaktivierte Methode beendet wurde, gibt das Drucksystem das setuprequoniert -Ereignis aus, das von der Benutzeroberfläche behandelt werden soll.Once the UI has attached event handlers and the OnActivated method has exited, the print system will fire the SetupRequested event for the UI to handle. Dieses Ereignis stellt die gleichen Daten bereit, die das Setup Ereignis für die Hintergrundaufgabe bereitgestellt hat, einschließlich der Informationen zum Druckauftrag und zum Druck Ticket, aber ohne die Möglichkeit, den Start zusätzlicher Benutzeroberflächen anzufordern.This event provides the same data that the background task setup event provided, including the print job info and print ticket document, but without the ability to request the launch of additional UI. In der Datei WorkflowPage.XAML.cs :In the WorkflowPage.xaml.cs file:

internal void OnSetupRequested(PrintWorkflowForegroundSession sessionManager, PrintWorkflowForegroundSetupRequestedEventArgs printTaskSetupArgs) {
    // If anything asynchronous is going to be done, you need to take out a deferral here,
    // since otherwise the next callback happens once this one exits, which may be premature
    Deferral setupRequestedDeferral = printTaskSetupArgs.GetDeferral();

    // Get information about the source application, print job title, and session ID
    string sourceApplicationName = printTaskSetupArgs.Configuration.SourceAppDisplayName;
    string jobTitle = printTaskSetupArgs.Configuration.JobTitle;
    string sessionId = printTaskSetupArgs.Configuration.SessionId;
    // the following string should be used when storing data that pertains to this workflow session
    // (such as user input data that is meant to change the print content later on)
    string localStorageVariablePrefix = string.Format("{0}::{1}::", sourceApplicationName, sessionID);

    try
    {
        // receive and store user input
        // ...
    }
    catch (Exception ex)
    {
        string errorMessage = ex.Message;
        Debug.WriteLine(errorMessage);
    }
    finally
    {
        // Complete the deferral taken out at the start of OnSetupRequested
        setupRequestedDeferral.Complete();
    }
}

Als nächstes gibt das Drucksystem das xpsdataavailable -Ereignis für die Benutzeroberfläche aus.Next, the print system will raise the XpsDataAvailable event for the UI. Im Handler für dieses Ereignis kann die Workflow-app auf alle Daten zugreifen, die für das Setup Ereignis verfügbar sind, und Sie kann die XPS-Daten zusätzlich direkt lesen, entweder als Stream von Rohdaten Bytes oder als Objektmodell.In the handler for this event, the workflow app can access all of the data available to the setup event and can additionally read the XPS data directly, either as a stream of raw bytes or as an object model. Der Zugriff auf die XPS-Daten ermöglicht der Benutzeroberfläche die Bereitstellung von Druckvorschau Diensten und das Bereitstellen zusätzlicher Informationen für den Benutzer über die Vorgänge, die von der Workflow-app für die Daten ausgeführt werden.Access to the XPS data allows the UI to provide print preview services and to provide additional information to the user about the operations that the workflow app will execute on the data.

Als Teil dieses Ereignis Handlers muss die Workflow-app ein Verzögerungs Objekt abrufen, wenn die Interaktion mit dem Benutzer fortgesetzt wird.As part of this event handler, the workflow app must acquire a deferral object if it will continue to interact with the user. Ohne eine Verzögerung betrachtet das Drucksystem die Benutzeroberflächen Aufgabe abgeschlossen, wenn der xpsdataavailable -Ereignishandler beendet wird oder eine Async-Methode aufruft.Without a deferral, the print system will consider the UI task complete when the XpsDataAvailable event handler exits or when it calls an async method. Wenn die APP alle erforderlichen Informationen aus der Interaktion des Benutzers mit der Benutzeroberfläche gesammelt hat, sollte Sie den Verzögerungs Vorgang vervollständigen, damit das Drucksystem dann fortfahren kann.When the app has gathered all required information from the user's interaction with the UI, it should complete the deferral so that the print system can then advance.

internal async void OnXpsDataAvailable(PrintWorkflowForegroundSession sessionManager, PrintWorkflowXpsDataAvailableEventArgs printTaskXpsAvailableEventArgs)
{
    // Take out a deferral
    Deferral xpsDataAvailableDeferral = printTaskXpsAvailableEventArgs.GetDeferral();

    SpoolStreamContent xpsStream = printTaskXpsAvailableEventArgs.Operation.XpsContent.GetSourceSpoolDataAsStreamContent();

    IInputStream inputStream = xpsStream.GetInputSpoolStream();

    using (var inputReader = new Windows.Storage.Streams.DataReader(inputStream))
    {
        // Read the XPS data from input stream
        byte[] xpsData = new byte[inputReader.UnconsumedBufferLength];
        while (inputReader.UnconsumedBufferLength > 0)
        {
            inputReader.ReadBytes(xpsData);
            // Do something with the XPS data, e.g. preview
            // ...
        }
    }

    // Complete the deferral taken out at the start of this method
    xpsDataAvailableDeferral.Complete();
}

Außerdem bietet die printworkflowsubmittedoperation -Instanz, die von den Ereignis Argumenten verfügbar gemacht wird, die Option, den Druckauftrag abzubrechen oder anzugeben, dass der Auftrag erfolgreich ist, aber kein Ausgabe Druckauftrag benötigt wird.Additionally, the PrintWorkflowSubmittedOperation instance exposed by the event args provides the option to cancel the print job or to indicate that the job is successful but that no output print job will be needed. Dies erfolgt durch Aufrufen der Complete -Methode mit einem printworkflowsubmittedstatus -Wert.This is done by calling the Complete method with a PrintWorkflowSubmittedStatus value.

Hinweis

Wenn die Workflow-app den Druckauftrag abbricht, wird dringend empfohlen, eine Popup Benachrichtigung bereitzustellen, die angibt, warum der Auftrag abgebrochen wurde.If the workflow app cancels the print job, it is highly recommended that it provide a toast notification indicating why the job was cancelled.

Abschließende Hintergrundarbeit am Druck InhaltDo final background work on the print content

Nachdem die Benutzeroberfläche die Verzögerung im printtaskxpsdataavailable -Ereignis abgeschlossen hat (oder wenn der UI-Schritt umgangen wurde), wird das über mittelte Ereignis für die Hintergrundaufgabe ausgelöst.Once the UI has completed the deferral in the PrintTaskXpsDataAvailable event (or if the UI step was bypassed), the print system will fire the Submitted event for the background task. Im-Handler für dieses Ereignis kann die Workflow-app Zugriff auf alle Daten erhalten, die vom xpsdataavailable -Ereignis bereitgestellt werden.In the handler for this event, the workflow app can get access to all of the same data provided by the XpsDataAvailable event. Anders als bei einem der vorangegangenen Ereignisse bietet gesendete jedoch auch Schreib Zugriff auf den endgültigen Inhalt des Druckauftrags über eine printworkflowtarget -Instanz.However, unlike any of the previous events, Submitted also provides write access to the final print job content through a PrintWorkflowTarget instance.

Das Objekt, das verwendet wird, um die Daten für den endgültigen Druck zu spoolen, hängt davon ab, ob als Rohdaten Strom oder als XPS-Objektmodell auf die Quelldaten zugegriffen wird.The object that is used to spool the data for final printing depends on whether the source data is accessed as a raw byte stream or as the XPS object model. Wenn die Workflow-app über einen Bytestream auf die Quelldaten zugreift, wird ein Ausgabe Byte-Stream bereitgestellt, in den die abschließenden Auftragsdaten geschrieben werden.When the workflow app accesses the source data through a byte stream, an output byte stream is provided to write the final job data to. Wenn die Workflow-app über das Objektmodell auf die Quelldaten zugreift, wird ein Dokumentwriter bereitgestellt, um Objekte in den Ausgabe Auftrag zu schreiben.When the workflow app accesses the source data through the object model, a document writer is provided to write objects to the output job. In beiden Fällen sollte die Workflow-app alle Quelldaten lesen, alle erforderlichen Daten ändern und die geänderten Daten in das Ausgabeziel schreiben.In either case, the workflow app should read all of the source data, modify any data required, and write the modified data to the output target.

Wenn die Hintergrundaufgabe das Schreiben der Daten beendet hat, sollte Sie für das entsprechende printworkflowsubmittedoperation -Objekt Complete aufrufen.When the background task finishes writing the data, it should call Complete on the corresponding PrintWorkflowSubmittedOperation object. Sobald die Workflow-app diesen Schritt abgeschlossen hat und der über mittelte Ereignishandler beendet wird, wird die Workflow Sitzung geschlossen, und der Benutzer kann den Status des letzten Druckauftrags über die standardmäßigen Druck Dialogfelder überwachen.Once the workflow app completes this step and the Submitted event handler exits, the workflow session is closed and the user can monitor the status of the final print job through the standard print dialogs.

Abschließende SchritteFinal steps

Registrieren der Druck Workflow-app für den DruckerRegister the print workflow app to the printer

Die Workflow-app ist mit einem Drucker verknüpft, der denselben Typ der Metadatendatei Übermittlung wie für wsdas verwendet.Your workflow app is associated with a printer using the same type of metadata file submission as for WSDAs. Tatsächlich kann eine einzige UWP-Anwendung sowohl als Workflow-app als auch als wsda fungieren, das Funktionen für Druckaufgaben Einstellungen bereitstellt.In fact, a single UWP application can act as both a workflow app and a WSDA that provides print task settings functionality. Befolgen Sie die entsprechenden wsda-Schritte zum Erstellen der metadatenzuordnung.Follow the corresponding WSDA steps for creating the metadata association.

Der Unterschied besteht darin, dass wsdas automatisch für den Benutzer aktiviert wird (die APP wird immer gestartet, wenn der Benutzer auf dem zugeordneten Gerät druckt), die Workflow-apps nicht.The difference is that while WSDAs are automatically activated for the user (the app will always launch when that user prints on the associated device), workflow apps are not. Sie verfügen über eine separate Richtlinie, die festgelegt werden muss.They have a separate policy that must be set.

Festlegen der Richtlinie für die Workflow-appSet the workflow app's policy

Die Workflow-app-Richtlinie wird von PowerShell-Befehlen auf dem Gerät festgelegt, auf dem die Workflow-app ausgeführt werden soll.The workflow app policy is set by Powershell commands on the device that is to run the workflow app. Die Befehle Set-Printer, Add-Printer (vorhandener Port) und Add-Printer (neuer WSD-Port) werden so geändert, dass Workflow Richtlinien festgelegt werden können.The Set-Printer, Add-Printer (existing port) and Add-Printer (new WSD port) commands will be modified to allow Workflow policies to be set.

  • Disabled: Workflow-apps werden nicht aktiviert.Disabled: Workflow apps will not be activated.
  • Uninitialized: Workflow-apps werden aktiviert, wenn die Workflow-DCA im System installiert ist.Uninitialized: Workflow apps will be activated if the Workflow DCA is installed in the system. Wenn die APP nicht installiert ist, wird der Druckvorgang trotzdem fortgesetzt.If the app is not installed, printing will still proceed.
  • Enabled: Der Workflow Vertrag wird aktiviert, wenn die Workflow-DCA im System installiert ist.Enabled: Workflow contract will be activated if the Workflow DCA is installed in the system. Wenn die APP nicht installiert ist, tritt beim Drucken ein Fehler auf.If the app is not installed, printing will fail.

Mit dem folgenden Befehl wird die Workflow-app auf dem angegebenen Drucker benötigt.The following command makes the workflow app required on the specified printer.

Set-Printer –Name "Microsoft XPS Document Writer" -WorkflowPolicy Enabled

Ein lokaler Benutzer kann diese Richtlinie auf einem lokalen Drucker ausführen, oder für die Enterprise-Implementierung kann der Drucker Administrator diese Richtlinie auf dem Drucker Server ausführen.A local user can run this policy on a local printer, or, for enterprise implementation, the printer administrator can run this policy on the Print Server. Die Richtlinie wird dann mit allen Clientverbindungen synchronisiert.The policy will then be synchronized to all client connections. Der Drucker Administrator kann diese Richtlinie immer dann verwenden, wenn ein neuer Drucker hinzugefügt wird.The printer admin can use this policy whenever a new printer is added.

Weitere InformationenSee also

Beispiel für Workflow-appWorkflow app sample

Windows. Graphics. Printing. Workflow-NamespaceWindows.Graphics.Printing.Workflow namespace