दिलचस्प पोस्ट
मानचित्र में प्रत्येक प्रविष्टि को प्रभावी ढंग से कैसे पुनरावृत्त करें? जावा का उपयोग करके आंशिक JSON प्रतिक्रिया कैसे वापस आती है? मैं जावा में स्ट्रिंग से एक फ़ाइल एक्सटेंशन कैसे ट्रिम कर सकता हूं? एम्बरजेएस / एम्बर डेटा में एक ही रूट के साथ कई मॉडल का उपयोग कैसे करें? नोकोगिरि, ओपन-यूरी और यूनिकोड वर्ण समान चौड़ाई फ्लेक्स आइटम वे लपेटो के बाद भी क्या कोई सीएसएस अभिभावक चयनकर्ता है? रूबी तरीके में विस्मयादिबोधक चिह्न क्यों उपयोग किए जाते हैं? अजगर समयक्षेत्र रूपांतरण "स्ट्रिंग का समाधान नहीं किया जा सका" त्रुटि Eclipse के लिए सी ++ (ग्रहण मानक लाइब्रेरी को हल नहीं कर सकता है) जेली बीन पर READ_LOGS अनुमति (एपीआई 16) पायथन में एक उथले सूची को सपाट करना वेबस्कॉट क्लाइंट API में HTTP शीर्षलेख एंड्रॉइड एनिमेट ड्रॉप डाउन / अप को उचित देखें क्या सी ++ के नए ऑपरेशन द्वारा पते की रिटर्न के संरेखण की कोई गारंटी है?

मेनूइटम शॉर्टकट को परिभाषित करना

मेनू आइटम के लिए शॉर्टकट सेट करने के लिए मुझे एक सरल तरीका चाहिए

लेकिन यह शॉर्टकट के साथ काम नहीं करता है, केवल क्लिक के साथ:

<MenuItem Header="Editar"> <MenuItem Header="Procurar" Name="MenuProcurar" InputGestureText="Ctrl+F" Click="MenuProcurar_Click"> <MenuItem.ToolTip> <ToolTip> Procurar </ToolTip> </MenuItem.ToolTip> </MenuItem> </MenuItem> 

मैं WPF 4.0 का उपयोग कर रहा हूँ

वेब के समाधान से एकत्रित समाधान "मेनूइटम शॉर्टकट को परिभाषित करना"

आपको KeyBindings (और KeyBindings ) का उपयोग करना होगा यदि आप (री) KeyBindings में जहां शॉर्टकट्स को काम करना चाहिए, KeyBindings जैसे कि ApplicationCommands क्लास में मिलते हैं) का उपयोग करें।

जैसे

 <Window.CommandBindings> <CommandBinding Command="New" Executed="CommandBinding_Executed" /> </Window.CommandBindings> <Window.InputBindings> <KeyBinding Key="N" Modifiers="Control" Command="New"/> </Window.InputBindings> 

कस्टम RoutedCommands :

 static class CustomCommands { public static RoutedCommand DoStuff = new RoutedCommand(); } 

उपयोग:

 <Window ... xmlns:local="clr-namespace:MyNamespace"> <Window.CommandBindings> <CommandBinding Command="local:CustomCommands.DoStuff" Executed="DoStuff_Executed" /> </Window.CommandBindings> <Window.InputBindings> <KeyBinding Key="D" Modifiers="Control" Command="local:CustomCommands.DoStuff"/> </Window.InputBindings> ... </Window> 

(यह आमतौर पर RelayCommand का उपयोग करने के बजाय ICommand इंटरफेस को कार्यान्वित करने में अधिक सुविधाजनक होता है। आप एक कन्स्ट्रक्टर बना सकते हैं जो RelayCommand और RelayCommand लिए प्रतिनिधि को आसानी से कमांड बनाते हैं जो अलग-अलग चीज़ें करते हैं, ऐसे कार्यान्वयन को अक्सर RelayCommand या RelayCommand कहा जाता है। CommandBindings जरूरत नहीं है।)

एचबी सही था … मैं सिर्फ और अधिक सटीक जोड़ना चाहता था

मेनू MenuItem पर Click घटना को निकालें और इसके बजाय Command से उसे जोड़ दें

1 – अपना आदेश जोड़ें / बनाएं:

  <Window.CommandBindings> <CommandBinding Command="Open" Executed="OpenCommandBinding_Executed"></CommandBinding> <CommandBinding Command="SaveAs" Executed="SaveAsCommandBinding_Executed"></CommandBinding> </Window.CommandBindings> 

आदेश निम्न कोड को संदर्भित कर रहे हैं

 private void OpenCommandBinding_Executed(object sender, ExecutedRoutedEventArgs e) { Open();//Implementation of open file } private void SaveAsCommandBinding_Executed(object sender, ExecutedRoutedEventArgs e) { SaveAs();//Implementation of saveAs } 

2 – वांछित कुंजी के साथ कमांड को संबद्ध करें:

 <Window.InputBindings> <KeyBinding Key="O" Modifiers="Control" Command="Open"></KeyBinding> <KeyBinding Key="S" Modifiers="Control" Command="SaveAs"></KeyBinding> </Window.InputBindings> 

3 – अंत में आप को मेनू आइटम के साथ कमांड आवंटित करें (InpuGestureText सिर्फ एक सजाने वाला पाठ है):

 <Menu Name="menu1" > <MenuItem Header="_File" > <MenuItem Name="menuOpen" Header="_Open..." Command="Open" InputGestureText="Ctrl+O" /> <MenuItem Name="menuSaveAs" Header="_Save as..." Command="SaveAs" InputGestureText="Ctrl+S" /> </MenuItem> </Menu> 

इस तरह से कई इनपुट एक ही कमांड के साथ सहयोगी हो सकते हैं।

मेरे नम्र राय में हेडर पर _ का उपयोग करने के लिए बहुत आसान है I इससे स्वचालित रूप से वांछित हॉटकी निर्मित होगा

उदाहरण के लिए:

 <MenuItem Header="_Editar"> <MenuItem Header="_Procurar" Name="MenuProcurar" InputGestureText="Ctrl+F" Click="MenuProcurar_Click"> <MenuItem.ToolTip> <ToolTip> Procurar </ToolTip> </MenuItem.ToolTip> </MenuItem> </MenuItem> 

मुझे विंडोज़ से अधिक पक्षपातपूर्ण रहा हूँ.फॉर्मस एंड गुलपी वीबी 6, इसलिए मैं योनातन और जेस के साथ सहमत हूं कि घटना नियंत्रक को स्थैतिक रूप से तार करने के लिए एक अधिक सीधा / प्रक्रियात्मक विधि होनी चाहिए, जो आवश्यक नहीं हैं CommandBindings और वहाँ है, मुझे लगता है।

इस तरह गैर- CommandBinding संचालकों का उपयोग करने के लिए एक अच्छा ट्यूटोरियल, लेकिन बटन पर जोर देने के साथ, इस एमएसडीएन ब्लॉग पोस्ट में पाया जा सकता है, मुझे विश्वास है। मैं MenuItem डिस्टिल्ड और लक्षित कर दूँगा …

ICommand बनाना

सबसे पहले, क्लास को कार्यान्वित करना ICommand लागू करना यदि आप चाहें, तो आप इसे कहीं भी, निश्चित रूप से, अपने मुख्य विंडो में भी रख सकते हैं। अपने डेमो कोड को सरलता से रखने के लिए जब आप dis / en / सक्षम मेनू आइटम को बाद में करना चाहते हैं, तो आप संभवत: CanExecute अधिक जटिल बनाना चाहते हैं, लेकिन अभी के लिए, हम हमेशा हमारे मेनू आइटम सक्षम होंगे।

 public class HelloWorldCommand : ICommand { public void Execute(object parameter) { MessageBox.Show(@"""Hello, world!"" from " + (parameter ?? "somewhere secret").ToString()); } public bool CanExecute(object parameter) { return true; } public event EventHandler CanExecuteChanged; } 

ट्यूटोरियल के रूप में मदद से बताते हैं, आप कहीं भी पहले से ही इस आदेश को कॉल कर सकते हैं …

 var hwc = new HelloWorldCommand(); if (hwc.CanExecute(this)) hwc.Execute(this); 

विंडो में अपना आदेश घोषित करना

तो हम HelloWorldCommand लिए हमारी विंडो में एक प्रकार की "घोषणा" जोड़ते हैं ताकि हम इसे बाद में उपयोग कर सकें। अपने Window टैग के अंदर, एक संसाधन के रूप में कमांड पंजीकृत करें:

 <Window.Resources> <local:HelloWorldCommand x:Key="hwc"/> </Window.Resources> 

अब हमारे पास "स्थानीय नामों वाला" कमांड, "hwc" जोड़ने के लिए एक साफ शॉर्टकट है, हालांकि आप स्पष्ट रूप से किसी भी स्ट्रिंग का उपयोग कर सकते हैं जो आप चाहते हैं। हम अपने xaml में बहुत कुछ उपयोग करेंगे।

वायर्डिंग (और पुन: उपयोग!) कमांड

चलो हमारे MenuItem s को अपने xaml में जोड़ते हैं। मैंने स्टॉक Grid को एक DockPanel साथ बदल दिया है क्योंकि यह सबसे आसान तरीका है (मेरे लिए) समान दूरी वाला विगेट्स जो Window भरने के लिए है, हालांकि मैंने अपना सभी यूआई बाहर छोड़ दिया है।

Command="{StaticResource hwc}" प्रत्येक MenuItem घोषणा में छिड़का नोट करें। कुंजी वहाँ में hwc है – याद रखें कि HelloWorldCommand लिए हमारा शॉर्टकट है जिसे हमने Window स्तर पर सेट किया है। और, ज़ाहिर है, StaticResource कहना है कि Window के संसाधनों को देखने के लिए हम कुछ भी बंधन नहीं कर रहे हैं; हम सिर्फ हमारे शॉर्टकट का उपयोग कर रहे हैं

 <DockPanel LastChildFill="True"> <Menu DockPanel.Dock="Top"> <MenuItem Header="_File"> <MenuItem Header="_Open" Command="{StaticResource hwc}" > <MenuItem.CommandParameter> <!-- so you could make this object as complex as you wanted, like, say, your entire Window. See magic incantation, below. --> <Binding RelativeSource="{RelativeSource FindAncestor, AncestorType=Window}" /> </MenuItem.CommandParameter> </MenuItem> <MenuItem Header="_Close" Command="{StaticResource hwc}" CommandParameter="Close" InputGestureText="Ctrl+G" /> <MenuItem Header="_Save" Command="{StaticResource hwc}" CommandParameter="Save" /> <Separator /> <MenuItem Header="_Quit" Command="{StaticResource hwc}" CommandParameter="Quit" /> </MenuItem> </DockPanel> 

इवेंट स्रोतों को अलग करने के लिए कमांड पार्मेटर्स

ध्यान दें कि हम सभी के लिए एक ही कमांड का उपयोग कर रहे हैं! लेकिन हम कैसे बता सकते हैं कि किस विजेट ने घटना को फेंक दिया? उसके लिए, आपको CommandParameter का उपयोग करने की आवश्यकता है – हमारे Execute विधि के हस्ताक्षर को याद रखें: Execute(object parameter) । उस CommandParameter पैरामीटर हम घटना को कैसे संभालना है यह जानने के लिए उपयोग कर सकते हैं। इसे चलाने का प्रयास करें और ध्यान दें कि CommandParameter आपको CommandParameter में जो भी हो, इसका प्रयोग आपको घटना के स्रोत के बारे में CommandParameter । हम इसे सभी मैन्युअल रूप से कर रहे हैं, लेकिन यह बहुत बुरा नहीं है।

यह भी ध्यान रखें कि आप इन ऑब्जेक्ट्स जितनी जटिल चाहते हैं उतनी जटिल कर सकते हैं। पैरामीटर को परिभाषित करने के लिए आप MenuItem टैग में किसी प्रॉपर्टी का उपयोग कर सकते हैं, या कुछ वास्तविक परिसर को परिभाषित करने के लिए "वास्तविक" <MenuItem.CommandParameter> टैग का उपयोग कर सकते हैं, जैसे ओपन मेनू आइटम में, ऊपर। इस मामले में, हम पूरे अभिभावक Window ऑब्जेक्ट को पारित कर रहे हैं , जो सबसे आसान (हालांकि साफ नहीं है) जिस तरह से हमारे VB6-ish प्रसंग को ईवेंट हैंडलर कोड में फेंकने का तरीका था।

MenuItem लिए कीबोर्ड शॉर्टकट्स जोड़ना (उर्फ, "ओपी का जवाब देना")

और अब हम अंत में मूल प्रश्न का जवाब दे सकते हैं! आखिरकार Close मेनू आइटम के लिए कीबोर्ड शॉर्टकट को तार दें। आप ध्यान दें कि हमने पहले से ही एक InputGestureText घोषित किया है अपने आप में, InputGestureText केवल कॉस्मेटिक है अगर हम अत्यधिक पीएं गए थे, तो हम तर्क दे सकते हैं कि कुंजीपटल शॉर्टकट बनाने के लिए तंत्र को MenuItem साथ कोई प्रत्यक्ष, निहित संबंध नहीं है!

कुंजीस्ट्रोक को पकड़ने के लिए हमें इसके बजाय (या अतिरिक्त) Window स्तर पर Ctrl-G के लिए एक श्रोता रजिस्टर करने की आवश्यकता है इसलिए अपने विंडो टैग के शीर्ष स्तर पर, इसे डालें (अनिवार्य रूप से यहां से लिया गया है ):

 <Window.InputBindings> <KeyBinding Modifiers="Control" Key="G" Command="{StaticResource hwc}" CommandParameter="window input binding" /> </Window.InputBindings> 

ध्यान दें कि आप इसे अपने KeyBinding में KeyBinding टैग्स को एक्सएमएल के एक स्वयं-समापन भाग से "वास्तविक" खुले और करीबी KeyBinding टैग पर ले KeyBinding सकते हैं।

और हम कर चुके हैं अपना ऐप चलाएं, और Ctrl-G दबाएं Whaddup।

सुंदर सीधा, एक बार जब आप सीधे खिलाड़ियों को मिलते हैं, और बहुत कम जादू बाध्यकारी- y आदेशों और MenuItems लिए सबसे intros से, मुझे लगता है


संभव समर्थक टिप:

पूरे CommandBinding चीज़ ने मुझे थोड़ी देर तक भ्रमित किया। यह केवल विशिष्ट कमांड प्रकार के लिए है, मुझे विश्वास है। यही है, आप केवल अपनी पसंद की कोई भी Command नहीं कर सकते। क्या यहाँ के बारे में बड़बड़ा रहा है की तरह सामग्री (क्या एक सभ्य परिचय ट्यूटोरियल है!) …

यह पूरी तरह से स्पष्ट नहीं हो सकता है, लेकिन आदेशों का उपयोग करके, हमें पूरी तरह से मुफ्त में चीजों का एक पूरा समूह मिला है: आइटम पर कुंजीपटल शॉर्टकट्स, पाठ और इनपुटजस्टाइन टेक्स्ट और सक्रिय नियंत्रण और इसकी स्थिति के आधार पर आइटम को सक्षम / निष्क्रिय कर देता है। इस स्थिति में, कट और कॉपी अक्षम हैं क्योंकि कोई पाठ नहीं चुना गया है, लेकिन पेस्ट सक्षम है, क्योंकि मेरा क्लिपबोर्ड रिक्त नहीं है!

… यह जादू-वाई है और यह जरूरी नहीं कि अच्छा है, और जब आप WPF मेनू में नए हों, तो आप भ्रमित हो सकते हैं।

आप RoutedUICommand में RoutedUICommand भी घोषित कर सकते हैं:

 <Window.Resources> <RoutedUICommand x:Key="BuildCmd" Text="Build"> <RoutedUICommand.InputGestures> <KeyGesture>CTRL+SHIFT+B</KeyGesture> </RoutedUICommand.InputGestures> </RoutedUICommand> </Window.Resources> 

बाइंडिंग करो

 <Window.CommandBindings> <CommandBinding Command="{StaticResource BuildCmd}" Executed="BuildCmdExecuted"/> </Window.CommandBindings> 

और MenuItem

 <MenuItem Command="{StaticResource BuildCmd}"/> 

एक अन्य समाधान पर यहां चर्चा की गई है ।