Upload
vo-quoc-duong
View
220
Download
0
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/xaml7/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