كيفية تحديد عناصر قائمة الملفات باستخدام لوحة المفاتيح في WPF وC#؟

StackOverflow https://stackoverflow.com/questions/1405537

  •  05-07-2019
  •  | 
  •  

سؤال

أقوم بتطوير تطبيق WPF UI.

لدي قائمة في أعلى الشاشة تحتوي على عناصر القائمة "ملف" و"تعليمات".

في الملف -> ميزات الواجهة الخلفية (مفتاح الاختصار هو ctrl + B)، والخروج (Ctrl + x) من عناصر القائمة الفرعية.

عند النقر على أي عنصر من عناصر القائمة الفرعية، يتم فتح النافذة المقابلة.

إذن بدون استخدام الفأرة بالضغط على ctrl + B أو Ctrl + x كيف يمكن فتح النافذة؟؟

وأيضًا، كيف يمكنني عرض خط صغير أسفل "F" في الملف بحيث عندما يضغط المستخدم على Alt + F، يجب أن تكون قائمة "ملف" مرئية.

أنا أعمل على WPF باستخدام C#.

هل كانت مفيدة؟

المحلول

وأنت تريد تحقيق ICommand، RoutedUICommand، InputGestureCollection، وCommandManager. ومن القليل من أعمال البنية التحتية أكثر مقدما، ولكن نمط WPF قيادة يسمح لك لتبادل أمر عبر القائمة الرئيسية، قائمة السياق، ونقرات زر، وما إلى ذلك مع الإجراءات الخاصة بك كما هو مكتوب أوامر، جميع الأماكن في التطبيق الخاص بك التي تستخدم القيادة سيمكن / تعطيل باستمرار وإضافة واحد أكثر طبقة من المراوغة للحد من تكرار التعليمات البرمجية.

والمثال التالي هو في VB.Net (آسف، ولكن نأمل أنه ينبغي أن يكون من السهل ترجمة).

وتنفيذ كل الإجراءات المطلوبة كطبقة التي تطبق ICommand:

Public Class OpenWindowCommand
  Implements ICommand

  Public Function CanExecute(parameter as Object) As Boolean Implements System.Windows.Input.ICommand.CanExecute
    'enter code that determines whether this command should be enabled or not
    'if you are listening to some backend logic that changes this state, you can
    'raise a CanExecuteChanged event
  End Function

  Public Sub Execute(parameter as Object) Implements System.Windows.Input.ICommand.Execute
     'code that you want to run for the action
  End Sub
 End Class

وإنشاء فئة التي تخزن مشتركة حالات كل من الأوامر الخاصة بك.

Public Class MyCommands
  Private Shared ReadyOnly openWindowCmd As ICommand = New OpenWindowCommand()
  Private Shared _openWindow as RoutedUICommand

  Shared Sub New()
    'static constructor
    Dim shortcut = New KeyGesture(Key.W, ModifierKeys.Control)
    RegisterCommand(_openWindow, "OpenWindow", "Open...", shortcut, AddressOf ExecuteOpenWindow, AddressOf CanExecuteOpenWindow)
    'add more commands as needed
  End Sub

  Private Shared Sub RegisterCommand(ByRef command as RoutedUICommand, ByVal name as String, ByVal text as String, ByVal gesture as KeyGesture, ByVal executeHandler as ExecutedRoutedEventHandler, ByVal canExecuteHandler as CanExecuteRoutedEventHandler)
    Dim inputs = New InputGestureCollection()
    If gesture IsNot Nothing Then inputs.Add(gesture)
    command = New RoutedUICommand(text, name, GetType(MyCommands), inputs)
    Dim binding = New CommandBinding(command, executeHandler, canExecuteHandler)
    Application.Current.MainWindow.CommandBindings.Add(binding)
    CommandManager.RegisterClassCommandBinding(GetType(Window),binding)
  End Sub

  Public Shared ReadOnly Property OpenWindow() as RoutedUICommand
    Get
      Return _openWindow
    End Get
  End Property
  Public Shared Sub ExecuteOpenWindow(sender as Object, e as ExecutedRoutedEventArgs)
    openCmd.Execute(e.Parameter)
  End Sub
  Public Shared Sub CanExecuteSave(sender as Object, e as CanExecuteRoutedEventArgs)
    e.CanExecute = openCmd.CanExecute(e.Parameter)
    e.Handled = True
  End Sub

End Class

والآن في XAML للحصول على القائمة الخاصة بك يمكنك ربط هذا الأمر:

<Window.Resources>
  <local:MyCommands x:Key="commands"/>
</Window.Resources>
...
<MenuItem Name="mnuOpenWindow" Command="{Binding Path=OpenWindow}"/>

وهذا هو أكثر قليلا من شرط الحد الأدنى لاستخدام أوامر، ولكن في تطبيق كبير معقول لقد وجدت هذه البنية التحتية إضافية مفيدة جدا. بمجرد كتابة أوامر ومسجلة وملزمة لهم في أي وثيقة XAML تافهة ومن خلال تعريض خصائص المشتركة لكل عمل من خلال الطبقة MyCommands يمكنك الوصول إلى الأوامر بحتة في التعليمات البرمجية إذا لزم الأمر.

نصائح أخرى

لإضافة خط صغير يمثل التسريع عنصر القائمة، استخدم تسطير في XAML:

<MenuItem Header="_File">
    <MenuItem Header="_Backend Features" />
    <MenuItem Header="E_xit" />
</MenuItem>

وأما بالنسبة للمفاتيح الاختصار، أولا أود أن أوصي لا تستخدم السيطرة + X للخروج، لأن ذلك يستخدم عادة لقص. عادة الخروج لايوجد مفتاح الاختصار، ولكن الضغط البديل + F4 لإغلاق الإطار الرئيسي سيكون لها نفس التأثير.

وحول السؤال الفعلي، لديك عدة خيارات، ولكن على حد سواء تحتاج إلى استخدام أوامر لتنفيذ التعامل مع MenuItems الخاص بك بدلا من الحدث Click.

والخيار الأول هو لوضع InputBinding لكل مفتاح الاختصار. سيتم القيام به شيء من هذا القبيل على الإطار الرئيسي الخاص بك:                   

لالسمة Command، وكنت بحاجة إلى تحديد تعبير يمثل الأمر لهذا الاختصار (كنت تستخدم نفس Command عند تحديد MenuItem، أيضا). إذا كان لديك فئة Commands، هل يمكن أن تفعل شيئا مثل ما يلي:

static class Commands
{
    public static ICommand BackendFeaturesCommand = ...;
}

وبعد ذلك في XAML:

<KeyBinding Key="B" Modifiers="Control"
    Command="{x:Static Commands.BackendFeaturesCommand}" />

والخيار الآخر هو تعريف القيادة ك <لأ href = "http://msdn.microsoft.com/en-us/library/system.windows.input.routeduicommand.aspx" يختلط = "نوفولو noreferrer" > RoutedUICommand ، وتحديد InputGesture لذلك. هذا وسوف تأخذ الرعاية من الأسلاك حتى مفتاح الاختصار بالنسبة لك.

يمكنك إلقاء نظرة على نموذج ShortCutKey لملف إطار تطبيق WPF (WAF).إنه أمر بسيط جدًا أن نفهمه.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top