مشاركة عبر


نظرة عامة على الأوامر

الأوامر آلية إدخال في Windows Presentation Foundation (WPF) والتي توفر معالجة الإدخال في مستوى دلالي أكثر من جهاز الإدخال. أمثلة الأوامر هي عمليات نسخ و قص و لصق الموجودة في العديد من التطبيقات.

هذه النظرة العامة تقوم بتعريف ما الأوامر في WPF الفئات التي تعتبر جزءاً من طراز الأوامر و كيفية استخدام وإنشاء أوامر في التطبيقات الخاصة بك.

يشمل هذا الموضوع على الأقسام التالية.

  • ما هي الأوامر؟

  • مثال أمر بسيط فيWPF

  • المفاهيم الأربعة الرئيسية في أوامر WPF

  • مكتبة الأمر

  • إنشاء أوامر مخصصة

ما هي الأوامر؟

الأوامر لها العديد من الأغراض. الغرض الأول هو فصل الدلالات و الكائن الذي يستدعي أمر من المنطق الذي ينفذ الأمر. يسمح هذا لمصادر منفصلة و متعددة باستدعاء منطق الأمر نفسه و تخصيص منطق الأمر لأهداف مختلفة. على سبيل المثال، عمليات التحرير نسخ و قص و لصق ، التي توجد في العديد من التطبيقات, يمكن استدعاءها باستخدام إجراءات المستخدم المختلفة إذا تم تطبيقها باستخدام الأوامر. قد يسمح تطبيق لمستخدم إلى قص الكائنات محددة أو نص أما بالنقر butإلىn أو اختيار عنصر في قائمة، أو استخدام تركيبة مفاتيح، مثل زر'Ctrl' + X. باستخدام الأوامر، يمكنك يربط كل نوع من الإجراء مستخدم إلى المنطق نفسه.

غرض آخر للأوامر هو الإشارة إلى ما إذا كان الإجراء متوفر أم لا. لمتابعة مثال قص كائن أو نص ، يكون الإجراء منطقي فقط عند تحديد شيء. إذا حاول مستخدم ما قص كائن أو نص دون تحديد أي شيء, لن يحدث أي شيء. للإشارة إلى هذا للمستخدم, تقوم العديد من التطبيقات بتعطيل أزرار وعناصر القائمة بحيث يعلم المستخدم ما إذا كان من الممكن تنفيذ الإجراء. يمكن لأمر الإشارة إلى ما إذا كان الإجراء ممكن عن طريق تطبيق أسلوب CanExecute. يمكن اشتراك زر CanExecuteChanged حدث و يتم تعطيله إذا CanExecute يقوم بإرجاع false أو يتم تمكينه إذا CanExecute يقوم بإرجاع true.

دلالات أمر تكون متناسقة عبر تطبيقات و فئات, و لكن يقتصر منطق الإجراء على كائن معين. تركيبة المفاتيح CTRL + X تقوم باستدعاء أمر قص في فئات نص و فئات الصور و برامج استعراض ويب و لكن يتم تعريف المنطق الفعلي لتنفيذ عملية قص من قبل التطبيق الذي يقوم بإجراء القص. RoutedCommand تمكن العملاء من تطبيق المنطق. كائن النص قد يقص النص المحدد إلى الحافظة بينما قد تقص كائن صورة الصورة المحددة. عندما يعالج أحد التطبيقات حدث Executed ، يكون لها وصول إلى هدف الأمر و يمكن أن تستغرق الإجراء المناسب بناءً على نوع الهدف.

مثال أمر بسيط فيWPF

أبسط طريقة لاستخدم أوامر في WPF هو استخدام المعرفة مسبقاً RoutedCommand من أحد فئات مكتبة الأمر; استخدم عنصر تحكم له دعم أصلي لمعالجة الأوامر; و استخدم عنصر تحكم له دعم أصلي لاستدعاء أمر. Paste الأمر أحد الأوامر المعرفة مسبقاً في فئة ApplicationCommands . TextBox له منطق مضمن لمعالجة Paste الأمر. فئةMenuItem تحتوي على دعم أصلي لاستدعاء الأوامر.

يظهر المثال التالي كيفية إعداد MenuItem بحيث عند النقر عليه سيتم استدعاؤه Paste الأوامر على TextBox ، على افتراض TextBox يحتوي على تركيز لوحة المفاتيح.

<StackPanel>
  <Menu>
    <MenuItem Command="ApplicationCommands.Paste" />
  </Menu>
  <TextBox />
</StackPanel>
            ' Creating the UI objects
            Dim mainStackPanel As New StackPanel()
            Dim pasteTextBox As New TextBox()
            Dim stackPanelMenu As New Menu()
            Dim pasteMenuItem As New MenuItem()

            ' Adding objects to the panel and the menu
            stackPanelMenu.Items.Add(pasteMenuItem)
            mainStackPanel.Children.Add(stackPanelMenu)
            mainStackPanel.Children.Add(pasteTextBox)

            ' Setting the command to the Paste command
            pasteMenuItem.Command = ApplicationCommands.Paste
// Creating the UI objects
StackPanel mainStackPanel = new StackPanel();
TextBox pasteTextBox = new TextBox();
Menu stackPanelMenu = new Menu();
MenuItem pasteMenuItem = new MenuItem();

// Adding objects to the panel and the menu
stackPanelMenu.Items.Add(pasteMenuItem);
mainStackPanel.Children.Add(stackPanelMenu);
mainStackPanel.Children.Add(pasteTextBox);

// Setting the command to the Paste command
pasteMenuItem.Command = ApplicationCommands.Paste;

المفاهيم الأربعة الرئيسية في أوامر WPF

طراز الأمر الموجّه في WPF يمكن تقسيمها إلى أربعة مفاهيم رئيسية: الأمر و مصدر الأمر و هدف الأمر و ربط الأمر:

  • يكون الأمر الإجراء لتنفيذه.

  • مصدر الأوامر الكائن الذي يستدعي الأمر.

  • هدف الأمر هو الكائن الذي يتم تنفيذ الأمر عليه.

  • ربط الأمر هو الكائن الذي يقوم بتعيين منطق الأوامر إلى الأمر.

في المثال السابق Paste الأمر هو الأمر ، MenuItem هو مصدر الأمر TextBox هو هدف الأمر و يتم توفير ربط الأمر بعنصر تحكم TextBox . و هو يستحق الانتباه إلى أنه ليس دائماً الحالة التي CommandBinding متوفرة بواسطة عنصر التحكم الذي هو فئة هدف الأمر. غالباً CommandBinding يتم إنشائها بواسطة مطور التطبيق أو CommandBinding قد يكون متصل بعنصر أصل هدف الأمر.

الأوامر

الأوامر في WPFتم إنشاؤها بواسطة تطبيق ICommandالواجهة. ICommandكشف أسلوبين،Execute، وCanExecute، وحدث ما،CanExecuteChanged. Execute بتنفيذ الإجراءات المقترنة بالأمر.CanExecute يحدد ما إذا كان يمكن تنفيذ الأمر على هدف الأمر الحالي. CanExecuteChanged يظهر إذا قام مدير الأمر الذي بجعل عمليات المرسل تكشف عن تغيير في مصدر الأمر الذي قد يؤدي إلى إبطال الأمر الذي تم تشغيله ولكن لم يتم تنفيذه بواسطة ربط الأمر. WPF تطبيق ICommand هو فئة RoutedCommand و هو تركيز النظرة العامة هذه.

مصادر الإدخال الرئيسي في WPF الماوس و لوحة المفاتيح و الحبر و الأوامر الموجّهة. تستخدم الإدخالات المطلوبة من الجهاز أكثر RoutedEvent لإعلام الكائنات في صفحة التطبيق بحدوث حدث إدخال. RoutedCommand ليست مختلفة. Execute و CanExecute أساليب RoutedCommand لا تحتوي على منطق تطبيق الأمر و لكن تنفذ الأحداث الموجهة التي تسير شجرة العنصر بطريقة النفق و الفقاعي حتى تواجه كائن ب CommandBinding. CommandBinding تحتوي على معالجات هذه الأحداث و هي المعالجات التي تقوم بتنفيذ الأمر. للحصول على مزيد من المعلومات حول توجيه الحدث في WPF راجع نظرة عامة حول الأحداث الموجهة.

Execute أسلوب على RoutedCommand تنفذ PreviewExecuted و Executed الأحداث على هدف الأمر. CanExecute أسلوب على RoutedCommand تنفذ CanExecute و PreviewCanExecute الأحداث على هدف الأمر. هذه الأحداث تسير شجرة العنصر بطريقة النفق و الفقاعي حتى تواجه كائن له CommandBinding لذلك الأمر المعين.

WPFتقدم مجموعة أوامر موجهة شائعة تنتشر عبر عدة فئات: MediaCommands, ApplicationCommands, NavigationCommands, ComponentCommands و EditingCommands. هذه الفئات تتكون من RoutedCommand كائنات و ليس منطق تطبيق الأمر. منطق التطبيق هو مسئولية الكائن الذي يتم تنفيذ الأمر عليه.

مصادر الأمر

مصدر الأمر هو الكائن الذي يستدعي الأمر. أمثلة ‏‫مصادر الأمر MenuItem ، Button ، و KeyGesture.

مصادر الأمر في WPF تنفذ بشكل عام ICommandSource واجهة.

ICommandSource تكشف عن خصائص ثلاثة: Command ، CommandTarget و CommandParameter

  • Command هو الأمر للتنفيذ عند استدعاء مصدر الأمر.

  • CommandTarget هو الكائن الذي سيتم تنفيذ الأمر. وهو يستحق الانتباه إلى WPF CommandTarget خاصية على ICommandSource قابلة للتطبيق فقط عند ICommand هو RoutedCommand. إذا كان CommandTarget تعيين على ICommandSource الأمر المطابق غير RoutedCommand ، هدف الأمر يتم تجاهله. إذا كان CommandTarget لم يتم تعيينه ، العنصر الذي له تركيز لوحة المفاتيح سيكون هدف الأمر.

  • CommandParameter هو نوع بيانات معرف من قبل المستخدم يستخدم لتمرير معلومات إلى معالجات تنفيذ الأمر.

التي تقوم بتنفيذ WPF للفئات ICommandSource يتم ButtonBase ، MenuItem ، Hyperlink ، و InputBinding. ButtonBase ،MenuItem ، وHyperlink استدعاء أمر عند النقر وInputBinding استدعاء أمر عندInputGesture تنفيذ المقترنة بها.

يوضح المثال التالي كيفية استخدام MenuItemفي ContextMenu كمصدر الأمر للأمر Properties.

<StackPanel>
  <StackPanel.ContextMenu>
    <ContextMenu>
      <MenuItem Command="ApplicationCommands.Properties" />
    </ContextMenu>
  </StackPanel.ContextMenu>
</StackPanel>
            Dim cmdSourcePanel As New StackPanel()
            Dim cmdSourceContextMenu As New ContextMenu()
            Dim cmdSourceMenuItem As New MenuItem()

            ' Add ContextMenu to the StackPanel.
            cmdSourcePanel.ContextMenu = cmdSourceContextMenu
            cmdSourcePanel.ContextMenu.Items.Add(cmdSourceMenuItem)

            ' Associate Command with MenuItem.
            cmdSourceMenuItem.Command = ApplicationCommands.Properties
StackPanel cmdSourcePanel = new StackPanel();
ContextMenu cmdSourceContextMenu = new ContextMenu();
MenuItem cmdSourceMenuItem = new MenuItem();

// Add ContextMenu to the StackPanel.
cmdSourcePanel.ContextMenu = cmdSourceContextMenu;
cmdSourcePanel.ContextMenu.Items.Add(cmdSourceMenuItem);

// Associate Command with MenuItem.
cmdSourceMenuItem.Command = ApplicationCommands.Properties;

عادةً ما يسمع مصدر أمر إلى حدث CanExecuteChanged. هذا الحدث يقوم بإعلام مصدر الأمر تغيير قدرة الأمر التنفيذ على هدف الأمر الحالي. يمكن استعلام مصدر الأمر عن حالة RoutedCommand باستخدام CanExecute الأسلوب. مصدر الأوامر يمكن ثم بتعطيل نفسه إذا لم يستطع تنفيذ الأمر. يوجد مثال لهذا MenuItem يتحول إلى اللون الرمادي عندما لا يستطيع تنفيذ الأمر.

InputGesture يمكن أن يتم استخدامه كمصدر الأمر. نوعان من إيماءات الإدخال في WPF يتم KeyGesture و MouseGesture. يمكنك اعتبار KeyGestureكـ اختصار لوحة مفاتيح، مثل كـ زر'Ctrl' + C. KeyGestureيتكون من Keyو التعيين من ModifierKeys. MouseGesture يتكون من MouseAction و مجموعة اختيارية من ModifierKeys.

من أجل InputGesture لتعمل كمصدر أمر , يجب أن تكون مقترنة بأمر. هناك عدة طرق لإنجاز هذا. طريقة باستخدام InputBinding.

يوضح المثال التالي كيفية إنشاء KeyBinding بين KeyGesture و RoutedCommand.

<Window.InputBindings>
  <KeyBinding Key="B"
              Modifiers="Control" 
              Command="ApplicationCommands.Open" />
</Window.InputBindings>
            Dim OpenKeyGesture As New KeyGesture(Key.B, ModifierKeys.Control)

            Dim OpenCmdKeybinding As New KeyBinding(ApplicationCommands.Open, OpenKeyGesture)

            Me.InputBindings.Add(OpenCmdKeybinding)
KeyGesture OpenKeyGesture = new KeyGesture(
    Key.B,
    ModifierKeys.Control);

KeyBinding OpenCmdKeybinding = new KeyBinding(
    ApplicationCommands.Open,
    OpenKeyGesture);

this.InputBindings.Add(OpenCmdKeybinding);

طريقة أخرى لإقران InputGesture إلى RoutedCommand هو إضافة InputGesture إلى InputGestureCollection على RoutedCommand.

يوضح المثال التالي كيفية إضافة KeyGesture إلى InputGestureCollection من RoutedCommand.

            Dim OpenCmdKeyGesture As New KeyGesture(Key.B, ModifierKeys.Control)

            ApplicationCommands.Open.InputGestures.Add(OpenCmdKeyGesture)
KeyGesture OpenCmdKeyGesture = new KeyGesture(
    Key.B,
    ModifierKeys.Control);

ApplicationCommands.Open.InputGestures.Add(OpenCmdKeyGesture);

CommandBinding

، CommandBinding يقوم بربط الأمر بمعالجات الحدث التي تنفذ الأمر.

CommandBinding تحتوي الفئة Command الخاصية، ثم PreviewExecuted ، Executed ، PreviewCanExecute ، و CanExecute الأحداث.

Command هو الأمر الذيCommandBinding يتم إقرانه. معالجات الأحداث التي تم إرفاقها ب PreviewExecuted و Executed أحداث تطبق منطق الأمر. معالجات الأحداث المرفقة إلى PreviewCanExecute و CanExecute الأحداث تحدد ما إذا كان يمكن تنفيذ الأمر على هدف الأمر الحالي.

يوضح المثال التالي كيفية إنشاء CommandBinding على جذر Window من التطبيقات. CommandBinding يرفقOpen أمر Executedو معالجات CanExecute.

<Window.CommandBindings>
  <CommandBinding Command="ApplicationCommands.Open"
                  Executed="OpenCmdExecuted"
                  CanExecute="OpenCmdCanExecute"/>
</Window.CommandBindings>
            ' Creating CommandBinding and attaching an Executed and CanExecute handler
            Dim OpenCmdBinding As New CommandBinding(ApplicationCommands.Open, AddressOf OpenCmdExecuted, AddressOf OpenCmdCanExecute)

            Me.CommandBindings.Add(OpenCmdBinding)
// Creating CommandBinding and attaching an Executed and CanExecute handler
CommandBinding OpenCmdBinding = new CommandBinding(
    ApplicationCommands.Open,
    OpenCmdExecuted,
    OpenCmdCanExecute);

this.CommandBindings.Add(OpenCmdBinding);

التالي, ExecutedRoutedEventHandler و CanExecuteRoutedEventHandler يتم إنشاؤهم. يفتحExecutedRoutedEventHandler MessageBox يعرض سلسلة تفيد بأنه تم تنفيذ الأمر. CanExecuteRoutedEventHandler يقوم بتعيين خاصية CanExecute إلىtrue.

Private Sub OpenCmdExecuted(ByVal sender As Object, ByVal e As ExecutedRoutedEventArgs)
    Dim command, targetobj As String
    command = CType(e.Command, RoutedCommand).Name
    targetobj = CType(sender, FrameworkElement).Name
    MessageBox.Show("The " + command + " command has been invoked on target object " + targetobj)
End Sub
void OpenCmdExecuted(object target, ExecutedRoutedEventArgs e)
{
    String command, targetobj;
    command = ((RoutedCommand)e.Command).Name;
    targetobj = ((FrameworkElement)target).Name;
    MessageBox.Show("The " + command +  " command has been invoked on target object " + targetobj);
}
Private Sub OpenCmdCanExecute(ByVal sender As Object, ByVal e As CanExecuteRoutedEventArgs)
    e.CanExecute = True
End Sub
void OpenCmdCanExecute(object sender, CanExecuteRoutedEventArgs e)
{
    e.CanExecute = true;
}

CommandBinding مرفق إلى كائن محدد مثل جذر Window من التطبيق أو عنصر التحكم. الكائن الذي CommandBinding مرفق بها ليعرّف نطاق الربط. على سبيل المثال، CommandBinding مرفق إلى عنصر أصل هدف الأمر يمكن الوصول إليه عن طريق Executed الحدث، ولكن CommandBinding مرفق إلى تابع هدف الأمر لا يمكن الوصول إليه. هذا اقتران مباشر لطريقة RoutedEvent أنفاق و فقاعات من الكائن الذي ينفذ الحدث.

في بعض الحالات CommandBinding موصول إلى هدف الأمر نفسه مثل TextBox الفئة و Cut ، Copy ، و Paste الأوامر. غالباً بالرغم من ذلك، يكون أكثر ملائمة إرفاق CommandBinding إلى عنصر أصل هدف الأمر مثل الرئيسي Window أو كائن التطبيق خاصة إذا كانت نفس CommandBinding يمكن استخدامه لأهداف أمر متعددة. هذه هي قرارات التصميم التي ستحتاج حسابها عندما يتم إنشاء بنية تحتية للأمر.

هدف الأمر

اهدف الأمر هو العنصر الذي يتم تنفيذ الأمر عليه. باعتبار RoutedCommand ، هدف الأمر هو العنصر عند أي توجيه Executed و CanExecute يبدأ. كما هو موضح سابقاً، في WPF CommandTarget خاصية على ICommandSource قابلة للتطبيق فقط عند ICommand هو RoutedCommand. إذا كان CommandTarget تعيين على ICommandSource الأمر المطابق غير RoutedCommand ، هدف الأمر يتم تجاهله.

يمكن لمصدر الأمر تعيين هدف الأمر. إذا كان هدف الأمر لم يتم تعريفه ، العنصر الذي له تركيز لوحة المفاتيح سيستخدم كهدف الأمر. أحد فوائد استخدام العنصر مع التركيز على لوحة المفاتيح كهدف الأمر هو أنه يسمح لمطور التطبيق باستخدام نفس مصدر الأمر لاستدعاء أمر على أهداف متعددة بدون الحاجة للتمكن من تعقّب هدف الأمر. على سبيل المثال، إذا MenuItem استدعاء أمر لصق في تطبيق ما TextBox عنصر تحكم و PasswordBox عنصر تحكم ، يمكن أن يكون الهدف إما TextBox أو PasswordBox استناداً إلى أي عنصر تحكم له تركيز لوحة المفاتيح.

المثال التالي يوضح كيفية تعيين هدف الأمر بوضوح في العلامات وفي التعليمات البرمجية الخلفية.

<StackPanel>
  <Menu>
    <MenuItem Command="ApplicationCommands.Paste"
              CommandTarget="{Binding ElementName=mainTextBox}" />
  </Menu>
  <TextBox Name="mainTextBox"/>
</StackPanel>
            ' Creating the UI objects
            Dim mainStackPanel As New StackPanel()
            Dim pasteTextBox As New TextBox()
            Dim stackPanelMenu As New Menu()
            Dim pasteMenuItem As New MenuItem()

            ' Adding objects to the panel and the menu
            stackPanelMenu.Items.Add(pasteMenuItem)
            mainStackPanel.Children.Add(stackPanelMenu)
            mainStackPanel.Children.Add(pasteTextBox)

            ' Setting the command to the Paste command
            pasteMenuItem.Command = ApplicationCommands.Paste
// Creating the UI objects
StackPanel mainStackPanel = new StackPanel();
TextBox pasteTextBox = new TextBox();
Menu stackPanelMenu = new Menu();
MenuItem pasteMenuItem = new MenuItem();

// Adding objects to the panel and the menu
stackPanelMenu.Items.Add(pasteMenuItem);
mainStackPanel.Children.Add(stackPanelMenu);
mainStackPanel.Children.Add(pasteTextBox);

// Setting the command to the Paste command
pasteMenuItem.Command = ApplicationCommands.Paste;

CommandManager

CommandManager يخدم عدد من الأوامر المتعلقة بالدالات. يوفر مجموعة من الأساليب الثابتة لإضافة و إزالة PreviewExecuted ، Executed ، PreviewCanExecute ، و CanExecute معالجات الأحداث من و إلى عنصر محدد. يوفر وسيلة تسجيل CommandBinding و InputBinding الكائنات إلى فئة معينة. CommandManager كما يوفر إحدى وسائل, خلال RequerySuggested الحدث، لإعلام أمر عندما يجب تنفيذ CanExecuteChanged الحدث.

InvalidateRequerySuggested يفرض الأسلوب CommandManager لتنفيذ RequerySuggested الحدث. هذا مفيد للشروط التي تقوم بتعطيل/بتمكين أمر ولكن لا تكون الشروط التي CommandManager تدركها.

مكتبة الأمر

WPF توفر مجموعة من الأوامر المعرفة مسبقاً. مكتبة الأمر تتكون من الفئات التالية: ApplicationCommandsو , NavigationCommandsMediaCommandsEditingCommands, و ComponentCommands. توفر هذه الفئات أوامر مثل Cut ، BrowseBack و BrowseForward ، Play ، Stop ، و Pause.

عدد من هذه الأوامر تتضمن مجموعة روابط إدخال افتراضية. على سبيل المثال، إذا قمت بتحديد أن يعالج التطبيق الخاص بك أمر النسخ تلقائياً, تحصل على ربط لوحة المفاتيح أوتوماتيكيا "CTRL + C" يمكنك أيضاً الحصول على الارتباطات لأجهزة الإدخال الأخرى مثل كمبيوتر لوحي إيماءات القلم و معلومات الكلام.

عندما تشير إلى أوامر في مكتبات الأمر المختلفة باستخدام XAML ، عادةً يمكنك حذف اسم فئة مكتبة الفئة التي تكشف عن خاصية الأمر الثابتة. بشكل عام، أسماء الأوامر لا يكون بها التباس كالسلاسل, و أنواع المالك موجودة لتوفير تجمّع منطقي للأوامر و لكنها ليست ضرورية من أجل إلغاء الغموض. على سبيل المثال، يمكنك تحديد Command="Cut" بدلاً من أكثر مطوّل Command="ApplicationCommands.Cut". هذه هي الآلية الملاءمة المضمّنة في WPF XAML معالج الأوامر (بشكل أكثر دقة, كان سلوك محول نوع من ICommand ، التي WPF XAML مراجع المعالج في وقت التحميل).

إنشاء أوامر مخصصة

إذا كانت الأوامر الموجودة في فئات مكتبة الأمر لا تتطابق مع احتياجاتك ثم يمكنك إنشاء الأوامر الخاصة بك. هناك طريقتان لإنشاء أمر مخصص. الأول هو البدء من الأرضي ثم تقوم بتطبيق ICommand الواجهة. الطريقة الأخرى, و هي الطريقة الأكثر شيوعًا, هي إنشاء RoutedCommand أو RoutedUICommand.

لمزيد من المعلومات حول إنشاء مخصص RoutedCommand راجع إنشاء نموذج RoutedCommand.

راجع أيضًا:

المهام

كيفية القيام بما يلي: تنفيذ ICommandSource

كيفية القيام بما يلي: إضافة أمر إلى MenuItem

المرجع

RoutedCommand

CommandBinding

InputBinding

CommandManager

المبادئ

نظرة عامة حول المدخلات

نظرة عامة حول الأحداث الموجهة

موارد أخرى

إنشاء نموذج RoutedCommand مخصص