2012-07-25 18 views
9

पर क्लिक के बाद बंद करने से कॉन्टेक्स्टमेनू को बंद रखें I System.Windows.Forms.ContextMenu का उपयोग कर रहा हूं। जब आप कुछ बटन क्लिक करते हैं, तो मैं इसे बनाना चाहता हूं, यह मेनू बंद नहीं करता है। अभी मैं इसे काम कर रहा हूं, जहां भी आप एक क्लिक करेंगे, यह उसी स्थिति में मेनू को फिर से खोल देगा। एकमात्र समस्या यह खराब दिखती है क्योंकि आप मेनू झिलमिलाहट देख सकते हैं। क्या ऐसा करने का कोई बेहतर तरीका है?सी # WinForms - कुछ आइटम

डब्ल्यूपीएफ के कॉन्टेक्स्टमेनू में StaysOpen संपत्ति है, लेकिन विन फॉर्म एक नहीं है। (क्या कोई तरीका है कि मैं WPF के ContextMenu का उपयोग कर सकता हूं?) मैं ContextMenuStrip का उपयोग नहीं करना चाहता, जो ऐसा कर सकता है, क्योंकि ContextMenu बहुत अच्छा दिखता है।

संपादित करें:

मैं क्योंकि यह ऐसा करने के लिए अच्छा नहीं है एक समाधान के रूप में चिह्नित करने के लिए नहीं जा रहा हूँ। यदि आपको मेरा प्रश्न पूछने की ज़रूरत है, तो एक तरीका WPC से UserControl बनाना होगा, और उसके बाद ऑब्जेक्ट को संदर्भ मेनू के साथ रखना होगा, फिर उसमें संदर्भ मेनू जोड़ें। अब क्योंकि यह डब्ल्यूपीएफ में है, बटन पर आप क्लिक पर मेनू को बंद नहीं करना चाहते हैं, मेन्यूइटम पर संपत्ति StaysOpenOnClick पर सेट करें। फिर बस इस उपयोगकर्ता नियंत्रण को अपने WinForms ऐप में रखें।

+0

मैं वापस गया और मेरे अन्य सवालों से कुछ जवाब स्वीकार कर लिया। जब मैंने उन्हें बनाया, मुझे नहीं पता था कि आपको ऐसा करना चाहिए। – Aidan

+0

कोई समस्या नहीं है। सही उत्तरों को स्वीकार करना हमेशा अच्छा होता है। इस तरह समुदाय प्रतिष्ठा बना सकता है। – CodeLikeBeaker

उत्तर

4

ContextMenu नियंत्रण का उपयोग करके ऐसा करने का कोई अच्छा तरीका नहीं है। वह देशी Win32 मेनू के आसपास सिर्फ एक रैपर है, यही कारण है कि यह इतना बेहतर दिखता है। यह ओएस एपीआई का उपयोग करके खींचा गया है, बस अन्य सभी अनुप्रयोगों में मेनू की तरह।

तुलना करें कि ContextMenuStrip नियंत्रण पर, जो सी # कोड में ढांचे द्वारा पूरी तरह से तैयार किया गया है। यह पहली बार रिलीज होने पर सुपर कूल (मुझे लगता है) वापस देखा गया, जब विंडोज़ और ऑफिस एक्सपी अलमारियों पर नवीनतम उत्पाद थे। जब विंडोज विस्टा लुढ़का, तो यह बेहद अप्रचलित हो गया। इसका एकमात्र लाभ यह है कि है कि आपके पास मेनू पर बहुत अधिक जुर्माना नियंत्रण है। उदाहरण के लिए, आप मेनू में कस्टम नियंत्रण होस्ट कर सकते हैं, और जब आप किसी आइटम पर क्लिक करते हैं तो आप मेनू को बंद होने से रोक सकते हैं। मूल Win32 मेनू के लिए समर्थन नहीं है।

बेशक, यह सिर्फ एक निरीक्षण या आकस्मिक चूक से अधिक है। उपयोगकर्ता ने पहले से ही कुछ चुनने के बाद एक खुला मेनू खोलने की इच्छा एक अच्छा संकेत है कि आपका डिज़ाइन गलत है। ध्यान रखें कि एक संदर्भ मेनू का उद्देश्य उपयोगकर्ता को प्रासंगिक रूप से प्रासंगिक विकल्पों तक तेजी से पहुंच देना है। उन्हें बस इतना करना है कि राइट-क्लिक करें (या उनके कीबोर्ड पर एक विशेष बटन दबाएं), और वे सीधे जो कुछ भी काम कर रहे हैं या पूरा करने की कोशिश कर रहे हैं, उससे संबंधित विकल्पों का मेनू देख सकते हैं। एक नियमित मेनू की तरह, वे एक विकल्प का चयन करने में सक्षम होना चाहिए और मेनू दूर जाना है।

विंडोज़ में, सभी मेनू "ऑटो-क्लोज़" हैं। यदि मेनू लगातार होना चाहिए, तो यह बिल्कुल मेनू नहीं होना चाहिए। एक टूलबार, एक साइड बार, या इसके बजाय कुछ प्रकार के कस्टम नियंत्रण का उपयोग करने पर विचार करें। उनको दूर जाने के लिए डिज़ाइन नहीं किया गया है जब उनके विकल्पों में से एक चुना जाता है, और इसलिए वे संबंधित विकल्पों को दिखाने के लिए आदर्श हैं जो हमेशा दिखाई देनी चाहिए।

यदि कोई विकल्प चुनने के बाद पर कोई संदर्भ मेनू नहीं गया, तो मैं एक बग होने पर विचार करता हूं। कम से कम, मुझे लगता है कि मेरा चयन "लेना" नहीं था और इसे फिर से क्लिक करने का प्रयास करें।

मैं क्यों WPF टीम अपने संदर्भ मेनू के लिए एक StaysOpen विकल्प प्रदान करने का निर्णय लिया नहीं थोड़ी सी भी सुराग है, या क्यों वे पहली जगह में अपने स्वयं के संदर्भ मेनू वर्ग दुबारा लिखा। क्या वे WinForms टीम से कुछ नहीं सीख चुके हैं जो पहले से ही एक ही काम कर चुके हैं?

ContextMenu नियंत्रण (और इसलिए मूल मेनू) के साथ आप जो भी पूछ रहे हैं, उसे करने का एकमात्र तरीका है जो आप वर्णन करते हैं- मेनू की पिछली स्थिति को संग्रहीत करते हैं, और कमांड का चयन करने के बाद , अपने पिछले स्थान में पॉप-अप मेनू को फिर से दिखाएं। झिलमिलाहट के लिए आप जो भी इलाज करते हैं (उदाहरण के लिए, स्क्रीन को ठंडा करना और संदर्भ मेनू को तब तक दबा देना जब तक कि संदर्भ मेनू को पुनर्स्थापित नहीं किया जाता है) लगभग बीमारी से भी बदतर होने की गारंटी है।

+0

धन्यवाद। मुझे पता है कि आप ऐसा करने के लिए "अनुमानित" नहीं हैं, लेकिन मेरी स्थिति में, मुझे लगता है कि यह अच्छी तरह से काम करता है। मेरे पास एक वृक्ष दृश्य है, जिसमें प्रत्येक नोड में इसके साथ जुड़े बूलियन विकल्प हो सकते हैं। मेरे पास उन विकल्पों को सेट करने के लिए प्रत्येक नोड से जुड़ा एक संदर्भ मेनू है, और मेरे पास वास्तविक बटन या चेकबॉक्स के लिए विंडो में कोई कमरा नहीं है। इसके अलावा चेकबॉक्स को ट्री व्यू की आसान पहुंच में होना चाहिए, पॉपअप विंडो या कुछ नहीं। – Aidan

+2

थोड़ा देर हो चुकी है, लेकिन मैं जोड़ना भूल गया: ContextMenu में बटन चेकबॉक्स बटन हैं, और मैं बटन में चेक स्थिति बदलते समय मेनू बंद नहीं करना चाहता हूं। आप इसे चेक/अनचेकिंग देख सकते हैं, इसलिए मुझे नहीं लगता कि यह आपके जैसा बग जैसा दिखता है। – Aidan

+1

संदर्भ मेनू उपयोगकर्ताओं के लिए विशेष रूप से खोजने योग्य नहीं हैं। उन्हें उन लोगों के लिए होना चाहिए जो उनके बारे में जानते हैं और उनका उपयोग करना चाहते हैं, लेकिन उन्हें आपके ऐप के साथ बातचीत की प्राथमिक विधि नहीं बननी चाहिए। मेरी सिफारिश * TreeView नियंत्रण के शीर्ष या नीचे एक छोटी टूलबार के लिए * बनाना * कमरा होगा। –

15

आप अपने संदर्भ मेनू इस तरह खुला रखना कर सकते हैं:

private void menu1ToolStripMenuItem_MouseDown(object sender, MouseEventArgs e) 
{ 
    CloseContextMenu = false; 
} 
फिर अपने संदर्भ मेनू समापन समारोह पर

:

private bool CloseContextMenu = true; //Class Variable 

फिर भी अपने मेनू आइटम के लिए MouseDown जोड़ने

private void contextMenuStrip1_Closing(object sender, ToolStripDropDownClosingEventArgs e) 
{ 
    e.Cancel = !CloseContextMenu; 
    CloseContextMenu = true; 
} 

फिर आप किसी भी मेनू ईवेंट में CloseContextMenu = false जोड़ सकते हैं।

उम्मीद है कि इससे मदद मिलती है।

+1

धन्यवाद, लेकिन मैं ContextMenu के बारे में बात कर रहा हूं, ContextMenuStrip नहीं। अफसोस की बात है, ContextMenu के करीबी कार्यक्रम में ई। कैंसल नहीं है (कम से कम मुझे पता नहीं है)। – Aidan

+0

इसे सरल बनाया जा सकता है: 'contextMenuStrip1.Closing + = (s, e) => e.Cancel = e.CloseReason == ToolStripDropDownCloseReason.ItemClicked; हालांकि अभी भी 'ContextMenu' के लिए काम नहीं करता है। –

-1

मैं बस अपना क्लिक करें घटना में

ContextMenuStrip1.Show(); 

गयी। जब मैं संदर्भ मेनू पर क्लिक करता हूं, तो यह बंद हो जाता है, लेकिन सीधे खुलता है, इसलिए यह प्रभावी रूप से खुला रहता है।