WPF - Tìm Hiểu Về ContextMenu Trong WPF (Menu ngữ cảnh)

Hôm nay chúng ta sẽ tìm hiểu cách tạo ra các menu chuột phải trên ứng dụng WPF của mình. Ở bài này chúng ta xoay quanh việc tìm hiểu cách tạo ra một ContextMenu - Menu ngữ cảnh và ở bài sau tôi sẽ chỉ cách Custom ContextMenu  cho đẹp hơn.
contextmenu tuanpham wpf


I> ContextMenu là gì?

ContextMenu là các menu ngữ cảnh, tức menu sẽ show cho chúng ta một số hành động mà chúng ta có thể thực thi trong bối cảnh nhất định nào đó. Thông thường, một người sử dụng cho hiển thị nhiều ContextMenu trong giao diện người dùng (UI) bằng cách nhấn phải chuột.
Một ContextMenu được đính kèm với một điều khiển cụ thể(Vùng, đối tượng). Các ContextMenu cho phép bạn trình bày cho người dùng một danh sách các mục/lệnh hoặc tùy chọn có liên quan với một control/panel cụ thể, ví dụ, một Button,Grid ... Người dùng phải click vào control/panel đó để làm cho menu xuất hiện. Điển hình, nhấp chuột vào một MenuItem sẽ mở ra một menu con hoặc thực hiện một lệnh nào đó.

II> Cách tạo ContextMenu

Hầu hết các Control trong WPF đều có thể chứa một ContextMenu, và tôi sẽ tạo ContextMenu cho một Button như sau bằng code XAML






Hoặc chúng ta có thể tạo với code C# như sau


btn = new Button();
btn.Content = "Created with C#";
contextmenu = new ContextMenu();
btn.ContextMenu = contextmenu;
mi = new MenuItem();
mi.Header = "File";
mia = new MenuItem();
mia.Header = "New";
mi.Items.Add(mia);
mib = new MenuItem();
mib.Header = "Open";
mi.Items.Add(mib);
mib1 = new MenuItem();
mib1.Header = "Recently Opened";
mib.Items.Add(mib1);
mib1a = new MenuItem();
mib1a.Header = "Text.xaml";
mib1.Items.Add(mib1a);
contextmenu.Items.Add(mi);
cv2.Children.Add(btn);


Kết quả khi Right_Click vào Button
contextmenu tuanphamdg wpf

Ngoài ra bạn cũng có thể lấy các mục menu từ các nguồn khác nhau để show tại một bối cảnh cụ thể nào đó bằng cách Merge ContextMenus - CompositeCollection




























Chúng ta sẽ thực hiện Handel Event cho việc Click vào MenuItem như sau





Để đẹp hơn chúng ta có thể Apply style cho các MenuItem, tôi tạo Style như sao



Lưu ý rằng để Apply style này cho đối tượng MenuItem thì tôi cần Set giá trị Style của mỗi MenuItem như sau Style="{StaticResource SimpleSysResources}". Nhưng chúng ta làm cho 12 Item thì thật mất công, vì vậy với một Control mà nó có thể chứa nhiều Item như Menu/ListBox thì chúng ta chỉ cần khai báo ở control cha(Menu/ListBox...) mà thôi. Thường chúng ta sẽ làm thế này


Đơn giản hơn chúng ta chỉ cần sử dụng property ItemContainerStyle=""





Kết quả contextmenu tuanphamdg  
Chúc các bạn thành công. SourceCode
Phạm Tuân


Chúc các bạn thành công!
PHẠM TUÂN