Acid Rain

WPF using WF - Simple Example

 

 Καλησπέρα,

Πρόσφατα έτυχε να χρειαστώ να πραγματοποιήσω ένα wpf (Windows Presentation Foundation) application χρησιμοποιώντας ένα workflow το οποίο να διαχειρίζεται τη ροή των πληροφοριών και των εργασιών. Είδα ουσιαστικά ότι το κομμάτι του wpf είναι ίδιαιτερα ενδιαφέρον καθώς φτιάχνεις τα γραφικά της φόρμας σου όπως σου τη βαρέσει!Big Smile 

 Στο ακόλουθο παράδειγμα θα δείξω πως φτιάχνουμε ένα απλό 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 ενώ δεν έχει ξεκινήσει

 

Είναι απλό σχετικά παράδειγμα αλλά πιστεύω πως απο τα απλά μαθαίνει κανείς.. Εύχομαι να σας φανεί χρήσιμο. Θα προσπάθησω να κάνω και μερικά ακόμα παραδείγματα στο μέλλον, απλά ακόμα το μαθαίνω και εγώ. Big Smile
Share/Bookmark

Comments

djsolid said:

Πολύ καλό post! Συγχαρητήρια!!

# Σεπτεμβρίου 21, 2008 11:42 πμ

Δημήτρης Γκανάτσιος said:

μπράβο ρε! Απλό, λιτό και επεξηγηματικό! Είμαι μεγάλος fan του Workflow Foundation, πιστεύω ότι σου λύνει τα χέρια σε πολλά προβλήματα! Keep posting!!!

Link για το post σου μπήκε και εδώ

www.studentguru.gr/.../10813.aspx

# Σεπτεμβρίου 21, 2008 1:55 μμ

Vangos said:

Πραγματικά πολύ ωραίο ποστ!!! Και χρήσιμο!

# Σεπτεμβρίου 21, 2008 4:31 μμ

ikaros said:

Μπράβο, σύντομο και επεξηγηματικό.

# Σεπτεμβρίου 22, 2008 12:20 μμ
Leave a Comment

(required) 

(required) 

(optional)

(required) 

Submit