WPF using WF - Simple Example
Καλησπέρα,
Πρόσφατα έτυχε να χρειαστώ να
πραγματοποιήσω ένα wpf (Windows Presentation Foundation) application
χρησιμοποιώντας ένα workflow το οποίο να διαχειρίζεται τη ροή των πληροφοριών
και των εργασιών. Είδα ουσιαστικά ότι το κομμάτι του wpf είναι ίδιαιτερα
ενδιαφέρον καθώς φτιάχνεις τα γραφικά της φόρμας σου όπως σου τη
βαρέσει!
Στο ακόλουθο παράδειγμα θα δείξω
πως φτιάχνουμε ένα απλό application wpf και ένα workflow, πως τα συνδέω και πως
περνάω της πληροφορίες απο το πρώτο στο δεύτερο.. Όλο το source μπορείτε να το βρείτε εδώ
Βήμα 1ο - Δημιουργία WPF
application
Αφού ανοίξουμε το Visual studio
(εγώ δουλεύω το 2008 αυτη τη στιγμή), πηγαίνουμε δημιουργία νέου project και
επιλέγω απο τη καρτέλα της
c# ->Windows->Wpf Application. Ας
το ονομάσουμε Mywpf και πατάμε ΟΚ.
Τώρα ουσιαστικά θα δημιουργήσουμε στο
παράθυρο που μας ανοιγέται τη μορφή του παραθύρου της εφαρμογής μας με τα
components που θέλουμε. Για το παραδειγμά μου θα χρησιμοποιήσω δυο textbox (NameTxt,
SurnameTxt), ένα Combobox με μερικές εθνικότητες (NationalityCmbx)
και 2 button (Submit1, CloseButton) με απλό drag and drop
απο το toolbox.

Βήμα 2ο - Δημιουργία Workflow
Έχοντας δημιουργήσει το WPF θα
προσθέσουμε στο solution μας ένα άλλο Project WF (Windows Workflow Foundation)
στο οποίο θα δημιουργήσουμε το απλό Workflow μας.
Έτσι πατάμε δεξί click στο solution μας
στο solution explorer και πατάμε στη συνέχεια Add -> New Project ->
Workflow -> Sequential Workflow Library και του δίνω το όνομα MyWorkflow.
Στο WF project μου θα προσθέσω ένα code
acitvity απο το Toolbox σερνοντάς το μεταξύ των 2 εικονιδίων που συμβολίζουν
την αρχή και το τέλος του Workflow με αντίστοιχα χρώματα το πράσινο και
το κόκκινo, όπως φαίνεται παρακάτω στο ακόλουθο screenshot.

Βήμα 3ο - References
Για να μπορέσει να γίνει η σύνδεση των
δύο project θα πρέπει αρχικά να προσθέσουμε μερικά references σε κάθε project.
Στο MyWorkflow πατάμε δεξί click πάλι στο solution Explorer και Add Reference. Θα χρειαστεί να ενσωματώσουμε την System.Windows.Presentation αφού μιλάμε για WPF application και την System.Windows.Forms.
Στο Mywpf με τις ίδιες κινήσεις
προσθέτουμε πάλι απο τη καρτέλα .NET τα εξής
- System.Workflow.Activities
- System.Workflow.ComponentModel
- System.Workflow.Runtime
Τέλος για να μπορούν να
"μιλάνε" τα δύο Project θα κάνουμε εισαγωγή στο Mywpf ως
reference στο άλλο Project πηγαίνοντας στη καρτέλα των Projects και επιλέγοντας
MyWorkflow.
Βήμα 4ο - Κώδικας
Στο τέταρτο βήμα θα γράψουμε το κώδικα
στο οποίο θα περνάμε στο workflow, που έχουμε φτιάξει ήδη, το όνομα, το
επίθετο, την επιλεγμένη εθνικότητα και την τρέχουσα ημερομηνία και ώρα
του χρήστη όταν πατάει το κουμπί Submit. Επίσης θα τοποθετηθεί ένα κουμπί που
θα κλείνει το workflow.
Στο MyWPF θα γράψουμε τον
εξής κώδικα σε C# γλώσσα
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Workflow.Runtime;
namespace MyWpf
{
/// <summary>
/// Interaction logic for Window1.xaml
/// </summary>
public partial class Window1 : Window
{
//δημιοργία ενος runtime του workflow
private WorkflowRuntime Workflow;
public Window1()
{
InitializeComponent();
}
private void Submit1_Click(object sender, RoutedEventArgs e)
{
if (Workflow == null)
{
Workflow = new WorkflowRuntime();
Workflow.StartRuntime();
}
//δημιουργία μεταβλητής για τη τρέχουσα ημερομηνία και ώρα
DateTime date = DateTime.Now;
//Δημιουργία ενός λεξικού με συγκεκριμένες λέξεις κλειδία και μια τιμή που τους αντιστοιχεί
Dictionary<string,object> parameters = new Dictionary<string,object>();
parameters.Add("Name", NameTxt.Text);
parameters.Add("Surname", SurnameTxt.Text);
parameters.Add("Date", date.ToString());
parameters.Add("Nationality", NationalityCmbx.Text);
WorkflowInstance instance = Workflow.CreateWorkflow(typeof(MyWorkflow.Workflow1), parameters);
instance.Start();
}
private void CloseButton_Click(object sender, RoutedEventArgs e)
{
if (Workflow != null)
{
if (Workflow.IsStarted)
{
Workflow.StopRuntime();
MessageBox.Show("Το Workflow τερματίστηκε με επιτυχία");
}
else
{
MessageBox.Show("To Workflow δεν έχει τεθεί σε λειτουργία ακόμα");
}
}
}
}
}
Ενώ στο MyWorkflow
τα παρακάτω
using System;
using System.ComponentModel;
using System.ComponentModel.Design;
using System.Collections;
using System.Drawing;
using System.Linq;
using System.Workflow.ComponentModel.Compiler;
using System.Workflow.ComponentModel.Serialization;
using System.Workflow.ComponentModel;
using System.Workflow.ComponentModel.Design;
using System.Workflow.Runtime;
using System.Workflow.Activities;
using System.Workflow.Activities.Rules;
using System.Windows.Forms;
namespace MyWorkflow
{
public sealed partial class Workflow1: SequentialWorkflowActivity
{
public Workflow1()
{
InitializeComponent();
}
private void codeActivity1_ExecuteCode(object sender, EventArgs e)
{
MessageBox.Show("Χρήστης: " + UserName + " " + UserSurname +"\nΕθνικότητας: " +UserNationality +"\nΗμερομηνία εισόδου: "+ LoginDate);
}
private string UserName;
public string Name
{
get { return UserName; }
set { UserName = value; }
}
private string UserSurname;
public string Surname
{
get { return UserSurname; }
set { UserSurname = value; }
}
private string LoginDate;
public string Date
{
get { return LoginDate; }
set { LoginDate = value; }
}
private string UserNationality;
public string Nationality
{
get { return UserNationality; }
set { UserNationality = value; }
}
}
}
Βήμα 5ο - Αποτελέσματα
Όλα καλά μέχρι εδώ αλλά αφού το τρέξω τι περιμένω να μου δείξει?? Κάποια πιθανά αποτελέσματα φαίνονται στα παρακάτω screenshots

Αποτέλεσμα μετά απο μια επιτυχή εκτέλεση

Μήνυμα μετα απο επιτυχή τερματισμό workflow
Μήνυμα μετά απο προσπάθεια τερματισμού workflow ενώ δεν έχει ξεκινήσει
Είναι
απλό σχετικά παράδειγμα αλλά πιστεύω πως απο τα απλά μαθαίνει κανείς..
Εύχομαι να σας φανεί χρήσιμο. Θα προσπάθησω να κάνω και μερικά ακόμα
παραδείγματα στο μέλλον, απλά ακόμα το μαθαίνω και εγώ.