Không có cách nào tốt để thực hiện việc này bằng cách sử dụng điều khiển ContextMenu
. Đó chỉ là một trình bao bọc xung quanh các menu Win32 bản địa, đó là lý do tại sao nó trông tốt hơn rất nhiều. Nó được vẽ bằng API OS, giống như các menu trong tất cả các ứng dụng khác.
So sánh điều đó với điều khiển ContextMenuStrip
, điều này hoàn toàn tùy chỉnh được vẽ bởi khung trong mã C#. Nó trông siêu mát mẻ (tôi đoán) trở lại khi nó lần đầu tiên được phát hành, khi Windows và Office XP là những sản phẩm mới nhất trên kệ. Khi Windows Vista tung ra, nó trở nên lỗi thời khủng khiếp. Lợi thế duy nhất nó hiện có là bạn có nhiều kiểm soát chi tiết hơn trên các menu. Ví dụ: bạn có thể lưu trữ các điều khiển tùy chỉnh trong menu và bạn có thể ngăn menu đóng khi bạn nhấp vào một trong các mục. Các trình đơn Win32 gốc không có hỗ trợ cho điều đó.
Tất nhiên, đó không chỉ là sự thiếu sót giám sát hoặc vô tình. Mong muốn giữ một menu ngữ cảnh mở sau khi người dùng đã chọn thứ gì đó là một đầu mối tốt mà thiết kế của bạn sai. Hãy nhớ rằng mục đích của menu ngữ cảnh là cung cấp cho người dùng quyền truy cập nhanh vào các tùy chọn có liên quan theo ngữ cảnh. Tất cả những gì họ phải làm là nhấp chuột phải (hoặc nhấn một nút đặc biệt trên bàn phím của họ) và họ có thể thấy trình đơn các lựa chọn liên quan trực tiếp đến những gì họ đang làm hoặc cố gắng hoàn thành. Cũng giống như một menu thông thường, chúng được cho là có khả năng chọn một tùy chọn và có trình đơn biến mất.
Trong Windows, tất cả các menu đều "tự động đóng". Nếu menu nên kiên trì, nó không phải là một thực đơn nào cả. Cân nhắc sử dụng thanh công cụ, thanh bên hoặc một số loại điều khiển tùy chỉnh thay thế. Những thứ đó không được thiết kế để biến mất khi một trong các tùy chọn của chúng được chọn và do đó chúng lý tưởng để hiển thị các tùy chọn liên quan nên luôn hiển thị.
Nếu menu ngữ cảnh trong ứng dụng không biến mất sau khi tôi đã chọn một tùy chọn, tôi cho rằng đó là lỗi. Ít nhất, tôi cho rằng lựa chọn của tôi không "mất" và thử nhấp lại vào lần nữa.
tôi không có đầu mối nhỏ lý do tại sao đội WPF quyết định cung cấp một lựa chọn StaysOpen
cho menu ngữ cảnh của họ, hoặc tại sao họ viết lại lớp menu ngữ cảnh riêng của họ ở nơi đầu tiên. Chẳng phải họ đã học được điều gì đó từ đội WinForms đã làm điều tương tự chưa?
Cách duy nhất để làm những gì bạn đang yêu cầu với điều khiển ContextMenu
(và do đó các menu gốc) là một bản hack tương tự như bạn mô tả — lưu trữ vị trí trước đó của menu và sau khi lệnh được chọn , reshow menu pop-up ở vị trí trước đó của nó. Bất cứ điều gì chữa bệnh bạn đưa ra cho nhấp nháy (ví dụ, đóng băng màn hình và đàn áp repaints cho đến khi menu ngữ cảnh được reshown) gần như được đảm bảo là tồi tệ hơn bệnh.
Nguồn
2012-07-25 20:51:27
Tôi đã quay lại và chấp nhận một số câu trả lời từ các câu hỏi khác của mình. Vào thời điểm tôi làm cho họ, tôi không biết bạn nên làm điều đó. – Aidan
Không sao cả. Nó luôn luôn là tốt để chấp nhận câu trả lời là chính xác. Bằng cách đó, cộng đồng có thể xây dựng danh tiếng. – CodeLikeBeaker