2009-03-02 15 views
41

मेरे पास एक ऐसा एप्लिकेशन है जिसमें मेनू और उप मेनू शामिल हैं। मैंने कट, कॉपी और पेस्ट जैसे कुछ उप मेनू आइटमों में एप्लाइओशन कमांड संलग्न किए हैं।
मेरे पास कुछ अन्य मेनू आइटम भी हैं जिनमें एप्लिकेशन कमांड नहीं हैं।
मैं उन सब मेनू आइटम्स में बाध्यकारी कस्टम कमांड कैसे जोड़ सकता हूं?
मैं this आलेख से गुजर चुका हूं लेकिन मेरे उप मेनू आइटम में ईवेंट संलग्न करने में असमर्थ हूं।मैं WPF में कस्टम रूटेड कमांड कैसे जोड़ूं?

+0

इस यूट्यूब लिंक को मिला। http://www.youtube.com/watch?v=mG4l0AaYBTM –

उत्तर

86

मैं एक स्थिर वर्ग है कि मैं Window1 वर्ग (या जो भी विंडो वर्ग नामित किया जाना होता है) के बाद जगह है जहाँ मैं RoutedUICommand वर्ग के उदाहरण बना का उपयोग करें:

public static class Command { 

    public static readonly RoutedUICommand DoSomething = new RoutedUICommand("Do something", "DoSomething", typeof(Window1)); 
    public static readonly RoutedUICommand SomeOtherAction = new RoutedUICommand("Some other action", "SomeOtherAction", typeof(Window1)); 
    public static readonly RoutedUICommand MoreDeeds = new RoutedUICommand("More deeds", "MoreDeeeds", typeof(Window1)); 

} 

खिड़की मार्कअप में एक नाम स्थान जोड़ें

:

xmlns:w="clr-namespace:NameSpaceOfTheApplication" 

अब मैं सिर्फ आवेदन आदेश के लिए के रूप में आदेश के लिए बाइंडिंग बना सकते हैं:, नाम स्थान का उपयोग कर Window1 कक्षा में है कि

और उदाहरण के लिए एक मेनू में बाइंडिंग का उपयोग:

<MenuItem Name="Menu_DoSomething" Header="Do Something" Command="w:Command.DoSomething" /> 
+5

RoutedUICommands को रखने के लिए _static_ कक्षा होने के कारण मेरे लिए कुंजी थी। (अगर वे मेरी विंडो 1 कक्षा में थे, तो एक्सएएमएल उन्हें नहीं ढूंढ सका।) धन्यवाद! – ewall

+9

कक्षा के महत्व को वास्तव में कम नहीं किया जा सकता है। निराशाजनक रूप से, डब्ल्यूपीएफ चुपचाप आदेशों को अनदेखा करता है अगर उन्हें एक गैर स्थैतिक वर्ग में परिभाषित किया गया है। –

+3

डाउनवोट क्यों? यदि आप यह नहीं समझते कि यह क्या है जो आपको लगता है कि गलत है, तो यह उत्तर में सुधार नहीं कर सकता है। – Guffa

61

इसके बजाय उन्हें एक स्थिर कक्षा में परिभाषित करने की है, तो आप के रूप में अच्छी आदेशों सीधे XAML में घोषित हो सकता है। उदाहरण (Guffas अच्छा उदाहरण से रूपांतरित):

<Window.Resources> 
    <RoutedUICommand x:Key="DoSomethingCommand" Text="Do Something" /> 
    <RoutedUICommand x:Key="DoSomethingElseCommand" Text="Do Something Else" /> 
</Window.Resources> 
<Window.CommandBindings> 
    <CommandBinding Command="{StaticResource DoSomethingCommand}" Executed="CommandBinding_DoSomething" /> 
    <CommandBinding Command="{StaticResource DoSomethingElseCommand}" Executed="CommandBinding_DoSomethingElse" /> 
</Window.CommandBindings> 
... 
<MenuItem Name="Menu_DoSomething" Header="Do Something" Command="{StaticResource DoSomethingCommand}" /> 
+1

क्या इनमें से कोई भी वास्तविक सी # कोड से बंधे हैं? यदि हां, तो कैसे? RoutedUICommands का क्या उद्देश्य है? वे क्या कार्यक्षमता जोड़ते हैं? –

+1

@ एडजे प्लप्केट: 1. हां। 2. कमांड बाइंडिंग के माध्यम से: 'CommandBinding_DoSomething' और' CommandBinding_DoSomethingElse' सी # कोड हैं। 3./4। RoutedCommands बनाम नियमित Button_Click-bindings के फायदों के बारे में एक सामान्य चर्चा के लिए, उदाहरण के लिए, http://joshsmithonwpf.wordpress.com/2008/03/18/understanding-routed-commands/ (अनुभाग "कौन परवाह करता है?")। – Heinzi

+0

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

15

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

मुझे गुफा और हेन्ज़ी उत्तर पसंद हैं, लेकिन आप पिछले परिणाम को प्राप्त करने के लिए केवल एक ही कमांड का उपयोग कर सकते हैं। मैं आमतौर पर सहायता आदेश

<Window.CommandBindings> 
     <CommandBinding Command="{StaticResource Help}" Executed="HelpExecuted" /> 
    </Window.CommandBindings> 

का उपयोग करें और मैं प्रत्येक कॉल जैसे साथ CommandParametr का उपयोग

<Window.InputBindings> 
    <KeyBinding Command="{StaticResource Help}" Key="A" Modifiers="Ctrl" CommandParameter="Case1"/> 
    <KeyBinding Command="{StaticResource Help}" Key="B" Modifiers="Ctrl" CommandParameter="Case2"/> 
    <KeyBinding Command="{StaticResource Help}" Key="C" Modifiers="Ctrl" CommandParameter="Case3"/> 
    <KeyBinding Command="{StaticResource Help}" Key="D" Modifiers="Ctrl" CommandParameter="Case4"/> 
    <MouseBinding Command="{StaticResource Help}" MouseAction="LeftDoubleClick" CommandParameter="Case5" /> 
</Window.InputBindings> 

या

<Button Command="Help" CommandParameter="Case6" Content="Button"> 
    <Button.InputBindings> 
     <KeyBinding Command="{StaticResource Help}" Gesture="Ctrl+D" CommandParameter="Case7"/> 
    </Button.InputBindings> 
</Button> 

व शर्तों को फ़ाइल में

private void HelpExecuted(object sender, ExecutedRoutedEventArgs e) 
{ 
    string str = e.Parameter as string; 
    switch (str) 
    { 
     case null://F1 Pressed default Help 
       //Code 
      break; 
     case "Case1": 
       //Code 
      break; 
     case "Case2": 
       //Code 
      break; 
     case "Case3": 
       //Code 
      break; 
     case "Case4": 
      break; 
     case "Case5": 
       //Code 
      break; 
     case "Case6": 
       //Code 
      break; 
     case "Case7": 
       //Code 
      break; 
    } 
    e.Handled = true; 
} 

और अगर आप एमवीवीएम पैटर्न

private void HelpExecuted(object sender, ExecutedRoutedEventArgs e) 
{ 
    string str = e.Parameter as string; 
    Mvvm_Variable.Action(Input: str); 
    e.Handled = true; 
} 

का उपयोग कर रहे हैं और स्विच को ViewModule साइट पर ले जा रहे हैं। और एक्शन एक ही व्यू मॉड्यूल क्लास में एक विधि है।

+1

बस टिकट! कमांड के प्रॉपर्टी वैल्यू का उपयोग करने के लिए मेरे लिए इतनी नई संभावनाएं खुल गई हैं :-) मैंने अभी एप्लीकेशन कमांड्स.NotACommand का उपयोग किया है, जो कि MinimizeWindow, MaximizeWindow और RestoreDownWindow – Heliac

+0

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

+0

@ बॉब, यह एक साधारण स्विच स्टेटमेंट है, सीमा प्रति रूप है आप सभी शॉर्टकट संयोजन का उपयोग करेंगे जो कमांड पैरामीटर स्ट्रिंग को प्रतिबिंबित करेगा। इस मामले में भी रूटेड कमांड आपकी मदद नहीं करेगा। –

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