WPF-Lesson 6 - Events and Commands

Embed Size (px)

Citation preview

  • 7/31/2019 WPF-Lesson 6 - Events and Commands

    1/24

    Microsoft VietnamDPE Team| WPFBi 6: X l s kin vlnh trong WPF 1

    Bi 6

    XL SKIN V LNH TRONG WPF

    Cc bi ging trc ch yu gii thiu v cc thnh phn trc quan trong WPF v vic lm

    th no to lp giao din ho kt hp nhng thnh phn. Tuy nhin, mt giao din ha

    khng ch mang tnh thm m cao m cn phi cho php ngi dng tng tc vi cc thnh phn

    trn . Vic tng tc ving dng ca ngi dng thng qua giao din ho c lin quan nhiu

    trn vic vit m lnh x l s kin (events) v lnh (commands). Mc d cc khi nim ny

    c cp sb trong cc bi ging trc, bi ging ny gii thiu mt cch c h thng hn v

    hai khi nim quan trng ny trong WPF.

    1. X l s kin trong WPF

    1.1. S kin

    Mi khi bn nhp chut vo mt nt bm hay g dng vn bn no vo mt form, bn

    ang s dngs kin(events). Trong lp trnh, c thnh nghas kin l mt hnh ngc

    pht ng bi ngi dng, bi mt thit b nhng hm (timer) hay bn phm, hoc thm ch l

    bi hiu hnh, ti nhng thiim phn ln l khng theo chu trnh nhtnh. V d, vi mt

    thit bnh v con tr nh chut, hnh ngnhp phm chut s gy nn s kinnhp chut. Mi

    khi mt s kin xy ra, thng thng d liu lin quan n s kinc thu thp v chuyn n

    ti mtn vx l s kin (event handler) x l tip. Cng c khi, s kin b b qua hay chuyn

    ti nhiu hm x l s kin mt lc nu nhng hm x l ny cng ng thi lng nghe s kin.

    D liu tng ng vi mt s kin t nht xc nh loi s kin, nhng i khi cng bao gm cc

    thng tin khc nh s kin xy ra ti thiim no, i tng no pht ng n...

    Thng thng, ta hu nh khng suy nghv vic s kin xy ra nh th no, v d lm sao

    my tnh nhn bit chut tri cnhp, hay mt phm trn bn phm c bm L do l v

    cc chi titmc thp ny c framework ho trong my tnh x l. Ngay ci vi ngi

    pht trin, cng vic ca ta vi s kin phn ln l x l phn b ni ca nhiu vnpha sau

  • 7/31/2019 WPF-Lesson 6 - Events and Commands

    2/24

    Microsoft VietnamDPE Team| WPFBi 6: X l s kin vlnh trong WPF 2

    mi s kin. Ngay c trong trng hp, c rt nhiu phnb ni cnc xem xt. Trong

    phn ny, trc ht ta tm hiu cch x l s kin trong WPF.

    1.2.n vx l s kin

    Min v x l s kin (event handler) n gin l mt phng thc (hm) nhnu vo

    t mt thit b nh chut hay bn phm v thc hin mt vic no phnng li vi mt s

    kin xy ra trn thit b. V d sau y minh hoon m lnh C# l mtn v x l s kin c

    tn ButtonOkClicked c tc dng x l s kin nt chutc bm:

    privatevoid ButtonOkClicked(object sender, RoutedEventArgs e)

    {

    this.Close(); //ng ca s hin thi

    }

    Trong cc phn tip theo, hiu, ta dng thm x l s kin vi ngha tng ng

    n v x l s kin

    Thc cht, c hai bc cn thc hin x l mt s kin:

    1. Lin ktn v x l s kin viiu khin (nt bm, trng vn bn, thcn), ni s kin tng ngc pht ng.

    2. Vit m lnh trong n v x l s kin lp trnh cc cng vic phnng

    li vi s kin.

    C hai cch lin kt mt s kin vi mtn v x l s kin. Bn c th dng (1) mt

    mi trng pht trin tch hp (IDE) nh Expression Blend hoc WPF Designer ca Visual Studio

    (cch trc quan); hoc (2) vit m lnh trc tip.

    1.2.1. Cch lin kttrc quan

    lin kt theo cch ny, ta cn c cc cng c thit k giao din GUI dnh cho WPF chng

    hn nh Expression Blend hoc WPF Designer ca Visual Studio. Vi cc cng c ny, vi mi

    phn t UI trn giao din ta c ca s lit k cc s kin. Vi mi s kin, ta c th phn nhn

  • 7/31/2019 WPF-Lesson 6 - Events and Commands

    3/24

    Microsoft VietnamDPE Team| WPFBi 6: X l s kin vlnh trong WPF 3

    v x l s kin bng cch khai bo tn hm x l (khng gmi s) bn cnh s kin ta mun bt

    v x l. Hnh 6.1 minh ho vic khai bo hm x l s kin ButtonOkClicked ng vi s kin

    Click ca nt bm btnOK s dng Expression Blend.

    Hnh 6.1 -Phn nh trcquan hm ButtonOkClicked x l s kin Click

    ca nt btnOK trn Expression Blend

    Sau khi khai bo, ta nhn Enter, mi trng s tng to sinh v chuyn ta n khun rng

    ca hm x l s kin c tn ging vi tn ta t cho n v x l s kin khi khai bo, v vi

    danh sch tham s ngmnh tng ng vi loi s kin. Nhim v ca ngi lp trnh lc ny l

    vit m lnh thc hin cc hnh ng phnng vi s kin bn trong hm x l ny. Trong v d v

    nt bm trn, khun dng t sinh ca hm x l s l:

    privatevoid ButtonOkClicked(object sender, RoutedEventArgs e)

    {

    //vit m x l vo y

    }

    Khi nhn li m XAML tng ng, ta s thy WPF s dng XAML khai bo lin kt gias kin m hm x l s kin nh th no:

  • 7/31/2019 WPF-Lesson 6 - Events and Commands

    4/24

    Microsoft VietnamDPE Team| WPFBi 6: X l s kin vlnh trong WPF 4

    Nh thy, gn kt s kin Click vi hm x l ButtonOkClicked, ta c th khai bo

    Click="ButtonOkClicked" trong khai bo to lp nt bm trong m XAML.

    1.2.2. Cch lin kt bng m lnh trc tip

    Ta cng c th lin kt s kin vo hm x l bng m lnh vi kt qu khng i. Bn c

    th t hi ti sao khng chn cch trc quan trn. Mt l do cbn l nu ta mun to ra cc iu

    khin mt cch linh ng, v d sinh ra mt hay nhiu nt bm trong thi gian chy (runtime) ch

    khng phi to lp sn trong thi gian thit k form (design-time), th cch duy nht lin kt s

    kin ca cc iu khin vo hm x l l thng qua m lnh. Xt vd sau y:

    Gi s ta c mt nt bm c tn l btnOK, v mc tiu ca ta l gn kt mt s kin ca n

    vi hm x l m ch dng m lnh. Tt c nhng vic phi lm l chn tn s kin tng ng m

    ta mun bt v lin kt n vi dng lnh new RoutedEventHandler vii s l tn ca hm x l

    ca ta. V d:

    btnOK.Click += newRoutedEventHandler(ButtonOkClicked);

    Tip theo ta khai bo hm x l vii s tng ng vi s kin. Thng thng mi loi s

    kin ca mi loiiu khin lii hi hm x l s kin tng ng vi n c cha danh sch tham

    s xc nh (c s lng, th t v kiu tham s xc nh trc), mc d tn gi ca hm x l c

    th tu . Nu ta s dng cch trc quan, cu trc ca hm x l s kin sc tng to ra.

    Vic ca ta ch l vit ni dung x l bn trong hm x l. Trong trng hp vit m lnh, ta phi

    t vit phn khai bo hm x l, trong , cn tun theo quy tcnh ngha v cu trc tham s (s

    lng, th t, kiu tham s) tng ng ca s kin. bitc cu trc ny, khng g khc

    ngoi vic tm c cc ti liu tham kho v s kin tng ng, m MSDN l ti liuy v

    chnh xc nht.

    Trong v d trn, phn ni dung hm x l s kin Click trong m C# s l:

    privatevoid ButtonOkClicked(object sender, RoutedEventArgs e)

    {

    this.Close();

  • 7/31/2019 WPF-Lesson 6 - Events and Commands

    5/24

    Microsoft VietnamDPE Team| WPFBi 6: X l s kin vlnh trong WPF 5

    }

    rng hm x l s kin trong v d cha 2 tham s m gi tr ca chng sc ly t

    s kinsendertham chiuni tng pht ng s kin (y l nt bm btnOK) v event(e)

    ch ra dng tc ng c th s kin b kch hot, chng hn nh bm phm hay nhp chut...Trong nhiu trng hp, bn khng cn phi quan tm n cc tham s ca hm x l s kin. V

    d, trong on m v dtrn, phn ni dung x l s kin khng h dng ti tham s sender ln

    tham s e. Tuy nhin, s c nhng trng hp trong , bn mun s dng cng mt hm x l ng

    vi nhiu s kin c cng bn cht hoc cho mtloi s kin ca nhiui tng cng loi. Khi ,

    ta phi quan tm niu khin no gi s kin, lc tham s sender v event c th s hu

    dng.

    1.3 S kin c nh tuyn

    WPF mrng m hnh lp trnh hng s kin chun ca .NET, bng vica ra mt loi

    s kin mi gi l s kin c nh tuyn(routed event). Loi s kin ny nng cao tnh linh hot

    trong cc tnh hung lp trnh hng s kin. Vic thit lp v x l mts kin c nh tuyn c

    th thc hin vi cng c php vi mt s kinthng (CLR event).

    1.3.1 Cy trc quan

    Trc khi bn lun thm vs kin c nh tuyn, mt khi nim quan trng cn bit l

    cy trc quan (visual tree). Mt giao din ngi dng WPF c xy dng theo phng thc phn

    lp, trong mt phn t trc quan khng c hoc c cc phn t con. Cu trc phn cp ca cc

    lp phn t trc quan nh th trn mt giao din ngi dng c gi l cy trc quan ca giao

    din. V d, xt giao dincnh ngha bngon m XAML sau:

    Yes

    No

    Cancel

  • 7/31/2019 WPF-Lesson 6 - Events and Commands

    6/24

    Microsoft VietnamDPE Team| WPFBi 6: X l s kin vlnh trong WPF 6

    Kt qu khi chy chng trnh:

    Cy trc quan tng ng s l:

    Hnh 6.2V d v cy trc quan

    1.3.2 S kin c nh tuyn l g?

    V mt chc nng, s kin c nh tuyn l mt loi s kin c th kch hot nhiun v

    x l s kin thuc v nhiuiu khin khc nhau trn cy trc quan, ch khng ch trn i tng

    pht ng s kin.

    Mtng dng WPF in hnh thng cha nhiu phn t UI. Bt kc to ra bng m

    lnh hay c khai bo bng XAML, cc thnh phn ny tn ti trong mi quan h kiu cy trc

    quan vi nhau - to nn cc tuyn quan hi t thnh phn ny ti thnh phn kia. Theo cc tuyn

    quan h , c ba phng thc nh tuyn s kin: lan truyn ln (bubble), lan truyn xung

    (tunnel) v trc tip (direct).

    Border

    StackPanel

    Button Button Button

  • 7/31/2019 WPF-Lesson 6 - Events and Commands

    7/24

    Microsoft VietnamDPE Team| WPFBi 6: X l s kin vlnh trong WPF 7

    Lan truyn ln (bubble) l phng thc thng thy nht. N c ngha l mt s kin s

    c truyn i trncy trc quan t thnh phn ngun(ni s kin c pht ng) cho ti khi n

    c x l hoc n chm ti nt gc. iu ny cho php ta x l mt s kin trn mt i tng

    nm cp trn so vi thnh phn ngun. V d, bn c th gn mt hm x l s kin Button.Click

    vo i tng Grid c cha nt bm thay v gn hm x l vo bn thn nt bm. S kin lan

    truyn ln c tn gi th hin hnh ng ca s kin, v d: MouseDown.

    S kin lan truyn xung (tunnel) i theo hng ngc li, bt u t nt gc v truyn

    xung cy trc quan cho ti khi n c x l hoc chm ti thnh phn gc ca s kin . iu

    ny cho php cc thnh phn cp trn c th chn s kin v x l n trc khi s kin chm ti

    thnh phn ngun (ni d nh xy ra s kin). Cc s kin lan truyn xung c tn c gn thm

    tin t Preview, v d,s kin PreviewMouseDown.

    S kin trc tip (direct) hot ng ging nh s kin thng thng trong .NET Framework.

    Ch c mt n v x l duy nht s c gn vi s kin trc tip.

    Thng thng, nu mt s kin lan truyn xung c nh ngha cho mt s kin no ,

    ng thi cng s c mt s kin lan truyn ln tngng. Trong trng hp , s kin lan truyn

    xung s c pht ng trc, bt u t gc v chy xung tm kim hm x l trn cy trc

    quan. Mt khi n c x l hoc chm ti thnh phn ngun, s kin lan truyn ln s c

    pht ng, lan truyn t thnh phn ngun i ngc ln tm ti hm x l n trn cy trc quan.

    S kin lan truyn ln hay xung s khng ngng lan truyn v mt hm x l n c gi. Do vy,

    nu ta mun dng qu trnh truyn xung hoc ln, ta phi nh du x l cho tham s s kin

    truyn vo, c th:

    privatevoid OnChildElementMouseDown(object sender, MouseButtonEventArgs

    e) {

    e.Handled = true;

    }

    Mt khi ta nh du x l cho s kin (e.Handled = true), n s khng c lan

    truyn tip na.

  • 7/31/2019 WPF-Lesson 6 - Events and Commands

    8/24

    Microsoft VietnamDPE Team| WPFBi 6: X l s kin vlnh trong WPF 8

    Hnh 6.3 - S kin c nh tuyntrn cy trc quan [xxx]

    Trli v d trn, ngun ca s kin Click l mt trong nhng thnh phn nt bm, v bt

    k nt no c bm, n s trthnh thnh phnu tin c php x l s kin. Tuy nhin, nu

    khng c n v x l no tng ng vi s kin Click gn vi nt , th s kin sc lan

    truyn ln trn phn t cha ca nt bm, trong trng hp ny l StackPanel, ri sau , lan truyn

    ti Border... Ni cch khc, tuyn lan truyn s kin Click s l:

    ButtonStackPanelBorder...

    1.3.3 Cc tnh hung c bn s dng s kin c nh tuyn

    Phn sau y tng kt nhng tnh hung cn vn dng khi nims kin c nh tuyn, v

    ti sao mt s kin CLR in hnh l khng trong nhng tnh hung.

    a.Bao ng v kt hp iu khin

    Nhiuiu khin trong WPF c cu trc ni dung phc hp. V d, ta c tht mt hnh

    nh bn trong mt nt bm, lm mrng cy trc quan ca nt bm. Tuy nhin, hnh nh thm vo

    khng c php ph vcch hit-testing, cch khin nt bm phnng vi vic nhp chut vo

    trong n, ngay c khi ngi dng nhp chut vo nhng pixel l mt phn ca hnh nh thm vo.

    b. Cc iu khin s dng cng mt n v x l s kin

  • 7/31/2019 WPF-Lesson 6 - Events and Commands

    9/24

    Microsoft VietnamDPE Team| WPFBi 6: X l s kin vlnh trong WPF 9

    Trong Windows Forms, c trng hp ta cn gn nhiu ln cng mtn v x l x l

    cc s kin thuc vo nhiu thnh phn khc nhau. S kin c nh tuyn cho php ta gn n v x

    l ch mt ln trong trng hp. Nh trong v d nu trong on m XAML, sau y l hm

    x l tng ng:

    privatevoid CommonClickHandler(object sender, RoutedEventArgs e)

    {

    FrameworkElement feSource = e.Source as FrameworkElement;

    switch (feSource.Name)

    {

    case"YesButton":

    // do something here ...break;

    case"NoButton":

    // do something ...

    break;

    case"CancelButton":

    // do something ...

    break;

    }

    e.Handled=true;}

    c. X l lp:

    S kin c nh tuyn cho php mtn v x l tnh (static) cnh ngha trong lp.

    n v x l lp ny c chi x l mt s kin trc khi mtn v x l gn vii tng c

    th no ca lp c th.

    d. Tham chiu n mt s kin m khng b hin tng phn x:

    Cc k thut markup v m lnhi hi phi c cch nh danh mt s kin. Mts kin

    c nh tuyn to ra trng RoutedEvent nh mtnh danh, cung cp mt k thutnh danh s

    kin mnh m khng i hi hin tng phn x tnh hoc run-time.

  • 7/31/2019 WPF-Lesson 6 - Events and Commands

    10/24

    Microsoft VietnamDPE Team| WPFBi 6: X l s kin vlnh trong WPF 10

    1.3.4 Li ch ca s kin c nh tuyn

    Cch thng bo s kin kiunh tuyn c nhiu li ch. Mt li ch rt quan trng cas

    kin c nh tuyn l mt thnh phn UI trc quan khng cn mc ni cng mt s kin trn tt c

    cc thnh phn con trong n, chng hn s kin MouseMove. Thay vo , n c th mc ni s

    kin ny vo bn thn n, v khi con chut di chuyn qua mt trong cc thnh phn con ca n, s

    kin ny sc lan truyn ti n.

    Mtu im quan trng khc cas kin c nh tuyn l cc thnh phntt c cc mc

    trong cy trc quan c th tng thc thi m lnh phnng li cc s kin ca cc thnh phn

    con ca chng, m khng cn cc thnh phn con phi thng bo khi s kin xy ra.

    1.3.5 Mt v d y v s kin c nh tuyn

    Form ch bao gm mt StackPanel cha 2 Button v 1 TextBlock c tn xc nh.

    StackPanel c phn nh bt s kin Click trn hai nt bm nm trong n. Nhim v can v

    x l s kin Click l cho biti tng no x l s kin Click, s kin Click pht ra t loii

    tng no, tn gi l g no, v loi lan truynnh tuync thc hin. Cc thng tin trn

    ca vo ni dung ca TextBlock v hin th ln mn hnh sau mi s kin Click.

    on m XAML khai bo giao din nh sau:

  • 7/31/2019 WPF-Lesson 6 - Events and Commands

    11/24

    Microsoft VietnamDPE Team| WPFBi 6: X l s kin vlnh trong WPF 11

    Nt bm 1

    Nt bm 2

    on m lnh C# cho hm HandleClick x l s kin Click:

    //Dng mt StringBuilder lu tr thng tin kt qu

    StringBuilder eventstr = newStringBuilder();

    //n v x l s kin Click ca Button

    void HandleClick(object sender, RoutedEventArgs args)

    {

    //Ly thng tin v i tng x l s kin Click

    FrameworkElement fe = (FrameworkElement)sender;

    eventstr.Append("S kin c x l bi i tng c tn: ");

    eventstr.Append(fe.Name);

    eventstr.Append("\n");

    //

    //Ly thng tin v ngun pht ra s kin CLick:

    FrameworkElement fe2 = (FrameworkElement)args.Source;

    eventstr.Append("S kin xut pht t ngun i tng kiu:

    ");

    //+ Loi thnh phn UI;

    eventstr.Append(args.Source.GetType().ToString());

    //+ nh danh;

    eventstr.Append(" vi tn gi: ");

    eventstr.Append(fe2.Name);

    eventstr.Append("\n");

    //

    //Ly thng tin v phng thc nh tuyn

    eventstr.Append("S kin s dng phng thc nh tuyn: ");

    eventstr.Append(args.RoutedEvent.RoutingStrategy);

    eventstr.Append("\n");

  • 7/31/2019 WPF-Lesson 6 - Events and Commands

    12/24

    Microsoft VietnamDPE Team| WPFBi 6: X l s kin vlnh trong WPF 12

    //

    //a thng tin ra mn hnh

    Results.Text = eventstr.ToString();

    }

    Kt qu nh sau:

    Hnh 6.4V d v s kin c nh tuyn

    2. Lnh (Command) trong WPF

    Ra lnh(commanding) l mt c ch nhp tin trong WPF cung cp kh nngx l u vo mc

    ng ngha hn l x l u vot thit b. Cc v d v command l cc hnh ng Copy, Cut v Paste m ta

    gp nhiu ng dng. Phn tip theo s trnh by tng quan v khi nim ny trong WPF.

    2.1 Lnh l g?

    im khc bit gia lnh v mt n v x l s kin n gin gn vi mt nt hay mt ng h

    m l: lnh tch bch gia ng nghacng nhngun phthnh ngvi logic thc hinhnh ng.

    iu ny cho php nhiu ngun khc bit nhau hon ton c th pht ng cng mt logic lnh, ng thi,

    cho php tu bin logic lnh tu vo cc i tng b tc ng khc nhau.

    V d in hnh v lnh l cc hnh ng Copy, Cut v Paste, c thy rt nhiu ng dng. Ng

    ngha cacc lnh ny l nht qun vi tt c cc ng dng v lp khc nhau (Copy - to bn sao t i

    tng c chn; Cut - to bn sao ri xo b i tng c chn (ct); Paste Chn i tng c

    copy/ct vo v tr c chn). Tuy nhin, logic hnh ng li tu thuc vo i tng c th m ta tc ng

    ln. V d, t hp phm CTRL+X c th pht ng lnh Cut trn cc lp vn bn, cc lp hnh nh v trn

    trnh duyt Web, nhng logic thc s thc hin hnh ng Cut li c nh ngha bi i tng hoc ng

  • 7/31/2019 WPF-Lesson 6 - Events and Commands

    13/24

    Microsoft VietnamDPE Team| WPFBi 6: X l s kin vlnh trong WPF 13

    dng m lnh ct tc ng ln ch khng phi t ngun pht ra lnh. C th hn, mt i tng vn bn

    c th ct on vn bn c chn vo clipboard, trong khi mt i tng hnh nh c th ct ly vng nh

    c chn, nhng ngun pht lnh l nh nhau - mt t hp phm hay mt nt bm trn thanh cng c.

    Mt cch n gin s dng lnh trong WPF l s dng mt RoutedCommand c nh sntrong cc lp th vin lnh; s dng mt iu khin c h tr sn x l lnh v mt iu khin h tr sn

    kh nng pht ng lnh. Trong v d di y, lnh Paste l mt trong nhng lnh nh sn trong lp

    ApplicationCommands. iu khin TextBox xy dng sn kh nng x l lnh Paste. V lp MenuItem

    h tr kh nng pht ng lnh.

    V d sau y minh ho cch thc to lp mt MenuItem khi nhp chut vo n, lnh Paste s

    c pht ng trn mt TextBox, vi gi thit l hp TextBox ang nhnc focus.

    M XAML:

    2.2 Nhng khi nim chnh trong h thng lnh ca WPF

    M hnh lnh trong WPF c thc chia thnh bn khi nim chnh: lnh, ngun lnh, ch lnh,

    v lin kt lnh, trong :

    - Lnh l hnh ngc thc hin

    - Ngun lnh l i tng pht ng lnh

    - ch lnh l i tng m lnh tc ng ln

    - Lin kt lnh l i tng nh x logic thc hin lnh vi lnh

    Trong v d trn y, Paste l lnh, MenuItem l ngun lnh, TextBox l ch lnh, v lin kt lnh

    c cung cp bi iu khin TextBox (nh sn). Cn lu rng khng phi lc no lin kt lnh

    (CommandBinding) cng c cung cp bi iu khin ng vai tr ch lnh. Thng thng,

  • 7/31/2019 WPF-Lesson 6 - Events and Commands

    14/24

    Microsoft VietnamDPE Team| WPFBi 6: X l s kin vlnh trong WPF 14

    CommandBinding phic to bi ngi lp trnh ng dng, hoc CommandBinding c thc gn vi

    i tng cha cach lnh.

    2.3 Lnh c nh tuyn

    S khc bit gia lnh c nh tuyn v s kin c nh tuyn l cch m lnh c dn

    ng t ni pht ng lnh (ngun lnh) ti ni x l lnh (ch lnh). Trong m hnh lnh c

    nh tuyn, s kin c nh tuync s dng di dng cc thng bo gia gia ngun lnh vo

    ch lnh (thng qua lin kt lnh).

    Trong mt thiim nhtnh, ch c mtn v x l lnh (gn vich lnh) sc

    thc s kch hot (n v x l lnh hotng). n v x l lnh hotngc xc nh bng

    vic kt hp gia v tr ca ngun lnh v ch lnh trn cy, v u l thnh phn UI ang nhn

    c focus. Khi lnhc pht i, s kin c nh tuyn sc s dng ginn v x l

    lnh hot ng, hi xem lnh ny c c cho php khng (thng qua phng thc

    CanExecute), cng nh thc hin logic hnh ng (thng qua pht ng phng thc Executed).

    Thng thng, ni pht lnh s tm lin kt lnh gia v tr ca n trn cy trc quan v nt

    gc ca cy trc quan. Nu n tm thy mt lin kt lnh nh th, n v x l lnh tng ng s

    xc nh lnh ny c c cho php thc hin khng. Nu nh lnhc gn vi mtiu khin

    trn thanh cng c hay menu, th mt vi bc logic thm sc thc hin tm dc theo ng

    i trn cy trc quan t nt gc ti phn tang nhnc focus tm kim mt lin kt lnh.

    Mtim quan trng cn hiu v vicnh tuyn trong lnh c nh tuyn ca WPF l mt khi mt

    n v x l lnhc kch hot, s khng c n v x l no khc c gi.

    nm r hn vu im ca vic s dng lnh trong WPF ta xt v d sau:

    2.4 Mt v d v s dng lnh trong WPF

    Ta xt mt form gm mt ListBox (c tn lsbCustomers) cha danh sch tn cc khch

    hng v mt menu c cha mc xo Delete, c tc dng xo mcc chn trong danh sch. Ta

  • 7/31/2019 WPF-Lesson 6 - Events and Commands

    15/24

    Microsoft VietnamDPE Team| WPFBi 6: X l s kin vlnh trong WPF 15

    mun chc chn rng ngi s dng phi chn tn khch hng trong danh sch trc khi c th

    bm mc xo Delete trn menu.

    on m sau s v hiu ho mc Delete trn csc mt mcc chn trong danh sch

    khch hng hay khng.

    privatevoid HandleMenus()

    {

    menuDelete.IsEnabled = lsbCustomers.SelectedItem != null;

    }

    y l cch thng thngng b ho vic cho php hay v hiu mt mc menu hay nt

    bmng vi mtiu kin no . t mc tiu nu cau bi, on m trn c thc

    gi trong n v x l s kin SelectionChanged ca ListBox nh sau:

    privatevoid lsbCustomers_SelectionChanged(object sender,

    SelectionChangedEventArgs e)

    {

    HandleMenus();

    }

    Cch x l da trn s kin kiu ny l bnh thng khi trn form ch c mt ListBox. Tuy

    nhin, khi form trnn phc tp hn, v d cha 2 ListBox, khi vic x l theo cch trn trnn

    phc tp. Tr li v d, gi s ta c thm mt ListBox c cha danh sch cc mt hng (c tn

    lsbProducts). C hai ListBox cha tn khch hng v tn mt hng u chu tc ng ca mc

    Delete khi chng nhnc focus v mt trong cc tn c chn. Trong trng hp ny, xt

    xem mc Delete nn b v hiu ho hay khng, iu kin kim tra trnn phc tp hn:

    privatevoid HandleMenus()

    {

    menuDelete.IsEnabled =

    (lsbCustomers.SelectedItem != null &&

    ((ListBoxItem)lsbCustomers.SelectedItem).IsFocused) ||

    (lsbProducts.SelectedItem != null &&

    ((ListBoxItem)lsbProducts.SelectedItem).IsFocused);

    }

  • 7/31/2019 WPF-Lesson 6 - Events and Commands

    16/24

    Microsoft VietnamDPE Team| WPFBi 6: X l s kin vlnh trong WPF 16

    ng thi, cng yu cu thm m lnhi vi vic x l s kin Click ln mc Delete trn

    menu: Ta phi xc nh ListBox no b tc ng:

    privatevoid menuDelete_Click(object sender, RoutedEventArgs e)

    {if (lsbCustomers.SelectedItem != null &&

    ((ListBoxItem)lsbCustomers.SelectedItem).IsFocused)

    lsbCustomers.Items.Remove(lsbCustomers.SelectedItem);

    elseif (lsbProducts.SelectedItem != null &&

    ((ListBoxItem)lsbProducts.SelectedItem).IsFocused)

    lsbProducts.Items.Remove(lsbProducts.SelectedItem);

    }

    Hy tng tng nu nh form cha khong 5 iu khin cng chu tc ng ca hnh ng

    Delete, phn m lnh x l s tr nn phc tp n mc no. May mn l WPF cung cp mt

    phng thc tt hn trong trng hp nh vy. Cch lnh trong WPF n gin ho m lnh trong

    trng hp ny bi n phn tch r gia lnh vi phn trin khai lnh (logic lnh), cho php ta lin

    ktiu khin vi nhng lnh c th, nh ta s thy trong tip theo.

    y l on m lnh tng ng cho v d trn s dng Command trong WPF.

    Khch hng:

  • 7/31/2019 WPF-Lesson 6 - Events and Commands

    17/24

    Microsoft VietnamDPE Team| WPFBi 6: X l s kin vlnh trong WPF 17

    Bi Nh Lc

    Ng Giang Thm

    Nguyn Y Vn

    on m u phn nh gi tr cho thuc tnh Command cho mc Delete trn menu. N

    cng gn mt lin kt lnh vo ListBox danh sch khch hng. Trong trng hp ny, menu Delete

    l ngun lnh, v ListBox ng vai tr l ch lnh. CommandBinding xc nh hm thc hini

    vi hai thuc tnh CanExecute v Executed. CanExecute xc nh khi no lnh Delete c thc

    thc hin, trong khi Executed xc nh thc hin logic lnh trn ch lnh nh th no. Sau y l

    m lnh ci t cho hai hm ny:

    privatevoid DeleteCustomer_CanExecute(object sender,

    CanExecuteRoutedEventArgs e)

    {

    e.CanExecute = lsbCustomers.SelectedItem != null;

    }

    privatevoid DeleteCustomer_Executed(object sender,

    ExecutedRoutedEventArgs e)

    {

    lsbCustomers.Items.Remove(lsbCustomers.SelectedItem);

    }

    Cho tiy, ta cha thycu im ca cch tip cn ny. Tuy nhin, trong trng hp

    thm vo mt ListBox danh sch sn phm, li ch ca phng php s th hin r hn. Sau y l

    on m XAML khai bo to lp ListBox cha danh sch sn phm:

    Sn phm sch:

  • 7/31/2019 WPF-Lesson 6 - Events and Commands

    18/24

    Microsoft VietnamDPE Team| WPFBi 6: X l s kin vlnh trong WPF 18

    Nu cn c ngy mai

    Chic l ri mu xanh

    Nhn gian chi ng

    Mt ln na, ta chcn ci t hai phng thc CanExecute v Executed nh sau:

    privatevoid DeleteProduct_CanExecute(object sender,

    CanExecuteRoutedEventArgs e)

    {

    e.CanExecute = lsbProducts.SelectedItem != null;

    }

    privatevoid DeleteProduct_Executed(object sender, ExecutedRoutedEventArgse)

    {

    lsbProducts.Items.Remove(lsbProducts.SelectedItem);

    }

    Khng ging nh cch tip cn truyn thng, khi s dng phng thc lnh trong WPF, ta khng

    cn phi thay i m cangun lnh (menu Delete) khi thm ListBox th hai. Cng ch rng bn

    khng cn phi cn nhciu khin no nhnc focus. Lp CommandManeger (lp phi hp

    hon ng ca cc lnh trong WPF) s tng tc vi FocusManager xc nhiu khin no hin

    ang nhn focus.

    Qua v d trn, ta cng thy mtcim quan trng ca lnh trong WPF l: Lnh khng t

    ng thc thilogic hnh ng. Lnh trong WPF n thun ch thng bo cho cc phn t UI bit

    rng c mt lnh c ng ngha nh th ang c pht ng - Bn thn phn t UI phi trin

    khai/hin thc ho logic hnh ng phnng li. Vic tch bch gia lnh v logic thc hin lnh l

    mtim mnh. Nh ta thy qua v d trn, lnh Delete c pht ng t cng ngun (Delete

    menu), nhng vic ci tc thc hin ring cho 2 i tng hon ton khc nhau.

  • 7/31/2019 WPF-Lesson 6 - Events and Commands

    19/24

    Microsoft VietnamDPE Team| WPFBi 6: X l s kin vlnh trong WPF 19

    2.5 Lnh t to

    T to cc lnh ca ring bn trong nhiu trng hp l cn thit. Vic ny cng khng qu

    phc tp trong WPF. lm c iu ny, lp lnh t to phi hin thc ho giao din

    ICommand. Tuy nhin, ta c th dng lp RoutedUICommand l lp c sn trong framework

    hin thc ho tt giao din ICommand. V d, sau y l cch to nn mt lnh cho php chn thm

    mt khch hng.

    Trong file code-behind C#, ta to mt lp mi c tn l MyCommands cha mt bin public

    kiu RoutedUICommand. Lp ny ct trong cng namespace vii tng Window chnh.

    on m v d nh sau:

    C#

    namespace Lesson6

    {

    publicstaticclassMyCommands

    {

    static MyCommands()

    {

    InsertCustomer = newRoutedUICommand(

    "Insert Customer", "InsertCustomer",

    typeof(MyCommands));

    }

    public readonlystaticRoutedUICommand InsertCustomer;

    }

    }

    Trong file .xaml, ta thm mt mc menu trn form:

    XAML

  • 7/31/2019 WPF-Lesson 6 - Events and Commands

    20/24

    Microsoft VietnamDPE Team| WPFBi 6: X l s kin vlnh trong WPF 20

    Sau , ta thm mt CommandBinding cho lnh mi ny cho Window chnh:

    Lu y, ta phi thay i mt cht phn khai bo Window chnh trong file xaml, c th

    l thm dng:

    xmlns:local="clr-namespace:Lesson6"

    Dng ny c nhim v ch ra ng dn logic n lp MyCommands trong namespace,

    trong v d l Lesson6, di tn tham chiu l local. Nh, vic gn thuc tnh Command cho

    mc menu hay Window.Binding mi thc hin c

    (Command="local:MyCommands.InsertCustomer"):

    Cui cng, ta ci t thm cc phng thc trong CommandBinding:

    privatevoid InsertCustomer_CanExecute(object sender,

    CanExecuteRoutedEventArgs e)

    {

    e.CanExecute = true;

    }

    privatevoid InsertCustomer_Executed(object sender,

    ExecutedRoutedEventArgs e)

    {

    http://schemas.microsoft.com/winfx/2006/xamlhttp://schemas.microsoft.com/winfx/2006/xaml
  • 7/31/2019 WPF-Lesson 6 - Events and Commands

    21/24

    Microsoft VietnamDPE Team| WPFBi 6: X l s kin vlnh trong WPF 21

    ListBoxItem item = newListBoxItem();

    item.Content = "New Customer";

    lsbCustomers.Items.Add(item);

    }

  • 7/31/2019 WPF-Lesson 6 - Events and Commands

    22/24

    Microsoft VietnamDPE Team| WPFBi 6: X l s kin vlnh trong WPF 22

    Cu hi n tp

    1. x l mt s kin cn thc hin nhng cng vic g?A. Vit m lnh thc hin cc hnh ng phnng vi s kin

    B. Kt ni s kin vi hm x l s kin

    C. C hai cng vic trn

    Tr li: C

    2. Mt s kin nh tuyn c th l:A. S kin truyn xung

    B. S kin truyn ln

    C. S kin trc tip

    D. Mt trong ba phng n a, b, c, tu thuc vo chin lc dn tuyn

    ca s kin

    E. C thng thi hai trong 3 phng n a, b, c

    Tr li: D

    3. Mtskinnh tuyn c thlan truyn:A. T phn t ngun ti phn t bt k trn cy trc quan

    B. Lan truyn theo mt trong hai hng: t phn t ngunn nt gc

    hoc t phn t ngunn cc nt con ca n

    C. Ch lan truyn (ngc hay xui) qua cc phn t nm trong on t

    nt gc ti phn t ngun m c quan h h hng vi phn t ngun.

    Tr li: C

    4. Vi m hnh s kin c nh tuyn, mt s kin lan truyn xungc:A. Lan truyn t phn t ngun ln phn t gctrong cy trc quan

    B. Lan truyn t nt gcn phn t ngun trong cy trc quan

    C. Lan truyn t phn t ngunxung cc nt con trong cy trc quan

  • 7/31/2019 WPF-Lesson 6 - Events and Commands

    23/24

    Microsoft VietnamDPE Team| WPFBi 6: X l s kin vlnh trong WPF 23

    Tr li: C

    5. Khi gn kt mt lnh vi mt i tng chu tc ng ca lnh, vic thchin lnh s do:

    A. Bn thn lnh t thc thi hnh ng tng ng vi ng ngha ca

    n, ngi lp trnh khng phi tc ng thm g

    B. Vic gn kt ch c tc dng thit lp vic pht thng bo cho i

    tng chu tc ng lnh bit n c ra lnh g mi khi lnhc gi, cn ngi

    lp trnh phi vit m lnh thc thi lnh nh th no

    C. Ngun pht lnh xc nh vic thc thi hnh ng

    Tr li: B

    6. u im ca vic s dng lnh c nh tuyn so vi x l s kin c nhtuyn:

    A. Ngun lnh (ni pht ng lnh) khng b cht vich lnh (ni x

    l lnh)chng khng cn cc tham chiu trc tip ln nhau nh trong trng hp

    lin kt bngn v x l s kin

    B. Lnh c nh tuyn s tng cho php hoc v hiu ho tt c cc

    iu khin UI tng ng khi ch lnh xc nh rng lnh b v hiu hoC. Lnh c nh tuyn cho php ta lin kt phm nng v cc dng nhp

    liu khc nh cch pht ng lnh

    D. C ba u im trn.

    Tr li: D

    7. Trong m hnh lnh c nh tuyn, mt khi mt n v x l lnh ckch hot thc hin:

    A. Ging nh s kin c nh tuyn, lnh li c lan truyn tip, do

    vy, c th c nhiun v x l lnh khc sc thc hin

    B. Khng n v x l no khc c gi

    C. Cn tu lnh c cnh du x l hay cha

  • 7/31/2019 WPF-Lesson 6 - Events and Commands

    24/24

    Microsoft Vietnam DPE Team| WPF Bi 6: X l s kin v lnh trong WPF 24

    Tr li: B

    Ti liu tham kho

    1. Routed Events Overview,http://msdn.microsoft.com/en-us/library/ms742806.aspx

    2. Event Handlers in WPF,http://www.kirupa.com/net/event_handlers_pg1.htm

    3. Overview of routed events in WPF, http://joshsmithonwpf.wordpress.com/2007/06/22/overview-

    of-routed-events-in-wpf/

    4. Introduction to the WPF Command Framework,

    http://www.devx.com/DevX/Article/37893/0/page/3

    5. Commanding Overview,http://msdn.microsoft.com/en-us/library/ms752308.aspx

    6. Understanding Routed Events and Commands In WPF,

    http://msdn.microsoft.com/en-us/magazine/cc785480.aspx

    http://msdn.microsoft.com/en-us/library/ms742806.aspxhttp://msdn.microsoft.com/en-us/library/ms742806.aspxhttp://msdn.microsoft.com/en-us/library/ms742806.aspxhttp://www.kirupa.com/net/event_handlers_pg1.htmhttp://www.kirupa.com/net/event_handlers_pg1.htmhttp://www.kirupa.com/net/event_handlers_pg1.htmhttp://joshsmithonwpf.wordpress.com/2007/06/22/overview-of-routed-events-in-wpf/http://joshsmithonwpf.wordpress.com/2007/06/22/overview-of-routed-events-in-wpf/http://joshsmithonwpf.wordpress.com/2007/06/22/overview-of-routed-events-in-wpf/http://www.devx.com/DevX/Article/37893/0/page/3http://www.devx.com/DevX/Article/37893/0/page/3http://msdn.microsoft.com/en-us/library/ms752308.aspxhttp://msdn.microsoft.com/en-us/library/ms752308.aspxhttp://msdn.microsoft.com/en-us/library/ms752308.aspxhttp://msdn.microsoft.com/en-us/magazine/cc785480.aspxhttp://msdn.microsoft.com/en-us/magazine/cc785480.aspxhttp://msdn.microsoft.com/en-us/magazine/cc785480.aspxhttp://msdn.microsoft.com/en-us/library/ms752308.aspxhttp://www.devx.com/DevX/Article/37893/0/page/3http://joshsmithonwpf.wordpress.com/2007/06/22/overview-of-routed-events-in-wpf/http://joshsmithonwpf.wordpress.com/2007/06/22/overview-of-routed-events-in-wpf/http://www.kirupa.com/net/event_handlers_pg1.htmhttp://msdn.microsoft.com/en-us/library/ms742806.aspx