2012-09-12 11 views
5

की अनुमति देता है, वर्तमान में मेरे पास Ctrl + C और Ctrl + V के साथ सी # Winforms ऐप है जो मुख्य मेनू संपादित करें पर कीबोर्ड शॉर्टकट के रूप में बाध्य है। कोड के अंदर कुछ कस्टम कॉपी/पेस्ट व्यवहार है जो इन मेनू आइटम्स का जवाब देता है, जैसे सूचीदृश्य में पंक्तियों की प्रतिलिपि बनाना और चिपकाना।सी # विनफॉर्म के साथ कस्टम कॉपी/पेस्ट व्यवहार जबकि पाठ संपादन प्रतिलिपि/पेस्ट

हालांकि, मेरी समस्या यह है कि आप एक पंक्ति के अंदर पाठ संपादित कर सकते हैं, और जब आप ऐसा करते हैं, तो मैं संपादन मेनू कमांड को ट्रिगर नहीं करने के लिए Ctrl + C और Ctrl + V चाहता हूं और सामान्य टेक्स्ट आधारित प्रतिलिपि के लिए डिफ़ॉल्ट होना चाहिए/पेस्ट करें।

एक चीज जिसने मैंने कोशिश की थी, पहले से लेबल लेबल और बाद में लेबल ईवेंट को ट्रिगर कर रहा है, और मैन्युअल रूप से मेनू आइटम को मैन्युअल रूप से अक्षम/पुनः सक्षम कर रहा है। दुर्भाग्यवश, ऐसा लगता है कि एक अक्षम मेनू आइटम पर एक कीबोर्ड शॉर्टकट अभी भी menu_Popup ईवेंट ट्रिगर करता है, जिसे वर्तमान में यह तय करने के लिए उपयोग किया जाता है कि कौन से मेनू आइटम सक्षम/अक्षम किए जाने चाहिए। (उदाहरण के लिए, क्लिपबोर्ड पर टेक्स्ट होने पर "पेस्ट" केवल सक्रिय है)। इसलिए यदि मैं मेनू आइटम को अक्षम करता हूं, तो कीबोर्ड शॉर्टकट अभी भी पॉपअप ईवेंट को सक्रिय करेगा, जो मेनू आइटम को फिर से सक्षम करेगा। (क्या यह एक बग है?)

मुझे पुराने शॉर्टकट को मैन्युअल रूप से संग्रहीत किए बिना मेनू आइटम कुंजीपटल शॉर्टकट को अस्थायी रूप से अक्षम करने की कोई विधि नहीं मिल रही है, शॉर्टकट को शून्य पर सेट करने के बाद, फिर इसे फिर से सक्षम करने की आवश्यकता होने पर इसे कॉपी करना (जो गंदे लगता है)।

निश्चित रूप से प्रतिलिपि/पेस्ट व्यवहार को ओवरराइड करना, या इसमें जोड़ना, करना एक आम बात है? क्या यहां उपयोग करने के लिए एक बेहतर पैटर्न है?

+0

ovveriding कॉपी पेस्ट मुझे एक बुरा विचार के रूप में लगता है। मैं 'प्रतिलिपि/पेस्ट' करने के लिए प्रयोग किया जाता है यह हमेशा सभी ऐप्स पर समान काम करता है। आपका ऐप सिर्फ मुझे भ्रमित करेगा। लेकिन यदि आप जोर देते हैं, तो फोकस की जांच क्यों न करें? यदि आपके टेक्स्ट बॉक्स पर फोकस है तो एक कॉपी पेस्ट करें यदि अन्य – Nahum

+0

नहीं है तो हमारी कस्टम कॉपी/पेस्ट व्यवहार केवल टेक्स्ट संपादित करने पर पंक्तियों की प्रतिलिपि बनाने और पेस्ट करने से संबंधित है।जब आप टेक्स्ट संपादित कर रहे हों तो मुझे डिफ़ॉल्ट प्रतिलिपि/पेस्ट व्यवहार चाहिए। –

+2

मेनू की शॉर्टकट कुंजी साफ़ करना सबसे आसान तरीका है। अन्य विकल्प 'गंदे' होंगे। –

उत्तर

0

ऐसा लगता है कि यदि आप डिफ़ॉल्ट प्रतिलिपि/पेस्ट व्यवहार को ओवरराइड करना चाहते हैं तो आपको सी # ऑफ़र से कम स्तर का उपयोग करने की आवश्यकता होगी (Clipboard event C# और Detect & Differentiate Clipboard Events (Cut,Copy and Paste) देखें)। हालांकि, शायद आप अपने तर्क को "गार्ड" के पीछे रख सकते हैं जो जानता है कि कार्रवाई के लिए अनुरोध कैसे करें (जैसे "प्रतिलिपि") और फिर उसे एप्रोप्रिट के रूप में रीडायरेक्ट करें। ,

namespace Your.App 
{ 
    public class GuardedCommand 
    { 
     public bool CurrentlyEditing { get; set; } 
     public GuardedCommand() 
     { 
      CurrentlyEditing = false; 
     } 
     public void DoCopy() 
     { 
      if(CurrentlyEditing) 
       StandardCopyCommand(); 
      else 
       ShortcutCopyCommand(); 
     } 
     void ShortcutCopyCommand() { /*menu work here (or delegate to another class)*/ } 
     void StandardCopyCommand() { /*"normal" work here (or delegate again)*/ } 
    } 
} 

उपयोग करने के लिए आप वर्ग पैदा करेगा तो सेट यह BeforeLabelEdit और AfterLabelEdit घटनाओं में के रूप में उपयुक्त guardedCommand.CurrentlyEditing संपत्ति है:

यहां नमूने के वर्ग है। फिर, जब आप CTRL + C शॉर्टकट पकड़ते हैं, तो बस guardedCommand.DoCopy() का आह्वान करें और यह बाकी की देखभाल करेगा।

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

और बस क्योंकि यह मेरे समय लगा कि पैरा की तुलना में यह केवल आपके कुछ कोड देने के लिए होता है लिखने के लिए, यहाँ कुछ कोड है:

namespace Your.App 
{ 
//correct implementation of the State Pattern 
    interface IClipboard 
    { 
     void Copy(); 
     void Paste(); 
    } 
    class MyCustomClipboard : IClipboard 
    { 
     public void Copy() { /*your special code*/ } 
     public void Paste() { /*your code again*/ } 
    } 
    class DefaultClipboard : IClipboard 
    { 
     public void Copy() { /*default code*/ } 
     public void Paste() { /*default code again*/ } 
    } 
    public class StateClass 
    { 
     IClipboard State { get; set; } 
     public StateClass() 
     { 
      CurrentlyEditing = false; 
     } 
     bool _currentlyEditing; 
     public bool CurrentlyEditing 
     { 
      get { return _currentlyEditing; } 
      set 
      { 
       _currentlyEditing = value; 
       if(_currentlyEditing) 
        State = new DefaultClipboard(); 
       else 
        State = new MyCustomClipboard(); 
      } 
     } 
     public void Copy() 
     { 
      State.Copy(); 
     } 
     public void Paste() 
     { 
      State.Paste(); 
     } 
    } 
} 

आप देख सकते हैं, यह एक बिट overkill जब हो सकता है वहाँ केवल दो राज्य हैं (और राज्यों की संख्या में वृद्धि नहीं होगी)।

+0

क्या इसका मतलब यह है कि मुझे डिफ़ॉल्ट प्रतिलिपि/पेस्ट व्यवहार को कोड करने की आवश्यकता होगी? यह ऐसा कुछ है जिसे मैं टालने की उम्मीद कर रहा था। इसके अलावा, क्या इसका मतलब यह है कि मैं दाईं ओर शॉर्टकट कुंजी कॉलम में मेनू पर कमांड सूचीबद्ध नहीं कर पाऊंगा? मेरे लिए आश्चर्य की बात यह है कि डिफ़ॉल्ट रूप से, जब मैं लेबल संपादित कर रहा हूं, तो कुंजीडाउन विधि Ctrl + C को कैप्चर नहीं करती है, लेकिन जब मैं इसे संपादित नहीं कर रहा हूं (जो उपयोगी है)। मेनू शॉर्टकट कुंजियों की तुलना में यह अलग व्यवहार है, जो असाइन किए जाने पर, मैं ट्रिगर कर दूंगा कि मैं संपादन कर रहा हूं या नहीं। –

+0

क्षमा करें, किसी कारण से मुझे यह धारणा मिली कि आपके पास पहले से लागू डिफ़ॉल्ट प्रतिलिपि/पेस्ट का उपयोग करने के लिए कोड था। अपने प्रश्न को दोबारा पढ़ने के बाद मैं देखता हूं कि आपने कभी इसका जिक्र नहीं किया है। मुझे संदेह है कि "सर्वश्रेष्ठ" समाधान राज्य (या [रणनीति] (http://en.wikipedia.org/wiki/Strategy_pattern)) का कार्यान्वयन होगा जो आपके लिए शॉर्टकट को सेट करने और साफ़ करने का ख्याल रखता है जैसे @ जॉन उल्लेख किया है कि आप किस राज्य में हैं/आप किस रणनीति का उपयोग करना चाहते हैं उसके आधार पर। –

संबंधित मुद्दे