ডাব্লুপিএফ-তে কীবোর্ড শর্টকাট


129

আমি _পরিবর্তে ব্যবহার সম্পর্কে জানি &, কিন্তু আমি সমস্ত Ctrl+ টাইপ শর্টকাট দেখছি ।

Ctrl+ + Zপূর্বাবস্থা জন্য, Ctrl+ + Sসংরক্ষণ জন্য, ইত্যাদি

ডাব্লুপিএফ অ্যাপ্লিকেশনগুলিতে এগুলি বাস্তবায়নের জন্য কি কোনও 'স্ট্যান্ডার্ড' উপায় আছে? অথবা এটি আপনার নিজের রোল করার এবং যে কোনও কমান্ড / নিয়ন্ত্রণের সাথে সেগুলি সংযুক্ত করার একটি কেস?

উত্তর:


170

একটি উপায় হ'ল আপনার শর্টকাট কীগুলি কমান্ডগুলিতে সেগুলি যুক্ত হিসাবে যুক্ত করা InputGestures। কমান্ড হিসাবে বাস্তবায়ন করা হয় RoutedCommands

এটি শর্টকাট কীগুলি কোনও নিয়ন্ত্রণে আবদ্ধ না থাকলেও কাজ করতে সক্ষম করে। এবং যেহেতু মেনু আইটেমগুলি কীবোর্ড অঙ্গভঙ্গি বোঝে, তাই আপনি যদি নিজের কমান্ডটি আপনার মেনু আইটেমটিতে আবদ্ধ করেন তবে মেনু আইটেমের পাঠ্যে তারা আপনার শর্টকাট কীটি স্বয়ংক্রিয়ভাবে প্রদর্শন করবে।

  1. কমান্ড ধরে রাখতে স্ট্যাটিক অ্যাট্রিবিউট তৈরি করুন (পছন্দসই স্টাটিক ক্লাসে সম্পত্তি হিসাবে আপনি কমান্ডগুলির জন্য তৈরি করেন - তবে একটি সাধারণ উদাহরণ হিসাবে কেবল উইন্ডো সিএস-এ স্ট্যাটিক অ্যাট্রিবিউট ব্যবহার করে):

     public static RoutedCommand MyCommand = new RoutedCommand();
  2. শর্টকাট কী (গুলি) যুক্ত করুন যাতে পদ্ধতিটি শুরু করা উচিত:

     MyCommand.InputGestures.Add(new KeyGesture(Key.S, ModifierKeys.Control));
  3. একটি কমান্ড বাইন্ডিং তৈরি করুন যা কার্যকর করার জন্য কল করার জন্য আপনার পদ্ধতির দিকে নির্দেশ করে। এটি ইউআই উপাদানগুলির জন্য কমান্ড বাইন্ডিংগুলিতে রাখুন যার অধীনে এটি (যেমন উইন্ডো) এবং পদ্ধতির জন্য কাজ করা উচিত:

     <Window.CommandBindings>
         <CommandBinding Command="{x:Static local:MyWindow.MyCommand}" Executed="MyCommandExecuted"/>
     </Window.CommandBindings>
    
     private void MyCommandExecuted(object sender, ExecutedRoutedEventArgs e) { ... }

4
আমি কীভাবে কমান্ডটি মেনু আইটেমের সাথে যুক্ত করব? অবশ্যই এই উত্তরের অন্তর্ভুক্ত করার জন্য এটি সবচেয়ে গুরুত্বপূর্ণ তথ্য হবে তবে এটি অনুপস্থিত।
টিমউই

8
@ টিমউই: আমি একটি বিদ্যমান ইভেন্টে কীবোর্ড শর্টকাট যুক্ত করতে উপরের কোডটি এইভাবে ব্যবহার করেছি: রুটেডকম্যান্ড সেন্টিমিটারসেটেটিংস = নতুন রাউটেডকম্যান্ড (); cmndSettings.InputGestures.Add (নতুন কীগ্যাসচার (কী। এস, মডিফায়ারকিজ.কন্ট্রোল)); কমান্ডবাইন্ডিংস.এড করুন (নতুন কমান্ডবাইন্ডিং (সেমিেন্ডসেটিংস, মেনুসেটেটিংস_ক্লিক));
itsho

1
itsho এর মন্তব্যটি এই কাজটি আমার জন্য তৈরি করেছে, উপরের এক্সএমএল কোডটি তৈরি করতে পারেনি।
gosr

1
দুর্ভাগ্যক্রমে, এই পদ্ধতির সাথে, Executedকমান্ডের কোডটি ভিউ-মডেলের পরিবর্তে কোড-পিছনে (উইন্ডো বা ব্যবহারকারী-নিয়ন্ত্রণের) শেষ হয়ে যাবে, সাধারণ কমান্ড (কাস্টম ICommandবাস্তবায়ন) ব্যবহারের বিপরীতে ।
অথবা ম্যাপার


97

আমি ডাব্লুপিএফ-তে কী বাঁধাইয়ের সাথে সম্পর্কিত ছিল তা ঠিক খুঁজে পেয়েছি:

<Window.InputBindings>
        <KeyBinding Modifiers="Control"
                    Key="N"
                    Command="{Binding CreateCustomerCommand}" />
</Window.InputBindings>

ব্লগ পোস্ট এমভিভিএম কমান্ড রেফারেন্স এবং কী বাইন্ডিং দেখুন


খুব সুন্দর এবং সহজ!
একীভূত করুন

1
আপনি কি "ক্রিয়েটকাস্টারকম্যান্ড" কী এবং এটি কীভাবে বাস্তবায়ন করা যায় সে সম্পর্কে বিশদ আলোচনা করতে কি আপত্তি করবেন?
ভিনজ

লিঙ্কযুক্ত ব্লগ পোস্টে "ফলাফলটি একটি ব্যতিক্রম হবে" দিয়ে বর্ণিত হওয়ার পরে এটি এখনও একটি লিঙ্কের উত্তর since : পি
মার্টিন শ্নাইডার

এখানে আশ্চর্য কাজ। আমি প্রথম ওপির মতো বোতামের সামগ্রীর কীটির আগে "_" যুক্ত করার চেষ্টা করেছি, তবে এটি কার্যকর হয়নি। সবচেয়ে খারাপ, যখন আমি ইন্টারফেসের একটি লিখনযোগ্য অবজেক্টে ফোকাস করতে না থাকি তখন আমি নিজেই কীটি হিট করেছিলাম তখন এটি সক্রিয় হয়েছিল .. ctrl-s এর পরিবর্তে সংরক্ষণের জন্য "s" এর মতো।
জে

14

এই কোডটি ব্যবহার করে দেখুন ...

প্রথমে একটি রুটেডকোমন্ড অবজেক্ট তৈরি করুন

  RoutedCommand newCmd = new RoutedCommand();
  newCmd.InputGestures.Add(new KeyGesture(Key.N, ModifierKeys.Control));
  CommandBindings.Add(new CommandBinding(newCmd, btnNew_Click));

9

এটি আপনি কোথায় ব্যবহার করতে চান তার উপর নির্ভর করে।

TextBoxBase-ডরিভড নিয়ন্ত্রণগুলি ইতিমধ্যে সেই শর্টকাটগুলি প্রয়োগ করে। আপনি যদি কাস্টম কীবোর্ড শর্টকাট ব্যবহার করতে চান তবে আপনার কমান্ড এবং ইনপুট অঙ্গভঙ্গিটি একবার দেখে নেওয়া উচিত। কোডটি স্যুইচ করুন থেকে একটি ছোট টিউটোরিয়াল : ডাব্লুপিএফ টিউটোরিয়াল - কমান্ড বাইন্ডিংস এবং কাস্টম কমান্ডস


8
কি বাজে টিউটোরিয়াল - সবার একেবারে গুরুত্বপূর্ণ বিষয়টিকে ব্যাখ্যা করে না, যা একটি কমান্ড কীভাবে ব্যবহার করতে হয় যা তাদের 20 "কমন" কমান্ডগুলির পূর্বনির্ধারিত সেটগুলির মধ্যে একটি না হয়।
টিমউই

6

অন্যদের জন্য এই উত্তরটি নথিভুক্ত করা, কারণ এটি করার অনেক সহজ উপায় যা খুব কমই উল্লেখ করা হয় এবং XAML এ স্পর্শ করার প্রয়োজন হয় না।

একটি কীবোর্ড শর্টকাট লিঙ্ক করতে, উইন্ডো কনস্ট্রাক্টর ইনপুটবাইন্ডিংস সংগ্রহে কেবল একটি নতুন কীবাইন্ডিং যুক্ত করুন। কমান্ড হিসাবে, আপনার স্বেচ্ছাসেবক কমান্ড শ্রেণিতে পাস করুন যা আইকোমন্ড প্রয়োগ করে। এক্সিকিউট পদ্ধতির জন্য, আপনার যা যুক্তি প্রয়োজন তা কেবল প্রয়োগ করুন। নীচে আমার উদাহরণে, আমার উইন্ডোকম্যান্ড শ্রেণি একটি প্রতিনিধি গ্রহণ করে যে এটি কার্যকর করা হবে যখনই ডাকা হবে। আমি যখন আমার বাঁধাইয়ের সাথে পাস করার জন্য নতুন উইন্ডোকম্যান্ডটি নির্মাণ করি, তখন আমি কেবল আমার প্রারম্ভকালে, যে পদ্ধতিটি আমি উইন্ডোকমন্ডের সম্পাদন করতে চাই তাতে ইঙ্গিত করি।

আপনি নিজের নিজস্ব কীবোর্ড শর্টকাটগুলি নিয়ে আসতে এই প্যাটার্নটি ব্যবহার করতে পারেন।

public YourWindow() //inside any WPF Window constructor
{
   ...
   //add this one statement to bind a new keyboard command shortcut
   InputBindings.Add(new KeyBinding( //add a new key-binding, and pass in your command object instance which contains the Execute method which WPF will execute
      new WindowCommand(this)
      {
         ExecuteDelegate = TogglePause //REPLACE TogglePause with your method delegate
      }, new KeyGesture(Key.P, ModifierKeys.Control)));
   ...
}

একটি সাধারণ উইন্ডোকম্যান্ড ক্লাস তৈরি করুন যা কোনও কার্যকর সেটাকে নিষ্ক্রিয় করতে ফাঁসির প্রতিনিধি গ্রহণ করে।

public class WindowCommand : ICommand
{
    private MainWindow _window;

    //Set this delegate when you initialize a new object. This is the method the command will execute. You can also change this delegate type if you need to.
    public Action ExecuteDelegate { get; set; }

    //You don't have to add a parameter that takes a constructor. I've just added one in case I need access to the window directly.
    public WindowCommand(MainWindow window)
    {
        _window = window;
    }

    //always called before executing the command, mine just always returns true
    public bool CanExecute(object parameter)
    {
        return true; //mine always returns true, yours can use a new CanExecute delegate, or add custom logic to this method instead.
    }

    public event EventHandler CanExecuteChanged; //i'm not using this, but it's required by the interface

    //the important method that executes the actual command logic
    public void Execute(object parameter)
    {
        if (ExecuteDelegate != null)
        {
            ExecuteDelegate();
        }
        else
        {
            throw new InvalidOperationException();
        }
    }
}

5

আমার অনুরূপ সমস্যা ছিল এবং @ আলিওয়াকে উত্তরটি সবচেয়ে সহায়ক এবং সবচেয়ে মার্জিত সমাধান বলে খুঁজে পেয়েছি; তবে, আমি একটি নির্দিষ্ট কী সমন্বয় প্রয়োজন, Ctrl+ + 1। দুর্ভাগ্যক্রমে আমি নিম্নলিখিত ত্রুটি পেয়েছি:

'1' কে 'কী'র মান হিসাবে ব্যবহার করা যায় না। নম্বরগুলি বৈধ গণনা মান নয়।

আরও কিছু অনুসন্ধানের সাথে আমি নীচের উত্তরগুলিতে @ অ্যালাইয়ার উত্তরটি পরিবর্তন করেছি:

<Window.InputBindings>
    <KeyBinding Gesture="Ctrl+1" Command="{Binding MyCommand}"/>
</Window.InputBindings>

আমার প্রয়োজনমতো কোনও সংমিশ্রনের জন্য দুর্দান্ত কাজ করতে আমি এটি পেয়েছি।


এটি আমার জন্য কাজ করেছে<UserControl.InputBindings> <KeyBinding Gesture="Enter" Command="{Binding someCommand}"/> </UserControl.InputBindings>
fs_tigre

3

VB.NET:

Public Shared SaveCommand_AltS As New RoutedCommand

বোঝাই ইভেন্টের ভিতরে :

SaveCommand_AltS.InputGestures.Add(New KeyGesture(Key.S, ModifierKeys.Control))

Me.CommandBindings.Add(New CommandBinding(SaveCommand_AltS, AddressOf Me.save))

কোনও এক্সএএমএল দরকার নেই।


1

যদিও শীর্ষস্থানীয় উত্তরগুলি সঠিক, আমি ব্যক্তিগতভাবে সংযুক্ত বৈশিষ্ট্যগুলির সাথে কাজ করতে পছন্দ করি যাতে সমাধানটি যে কোনওটিতে প্রয়োগ করা যায় UIElement, বিশেষত যখন যখন Windowউপাদানটির দিকে মনোনিবেশ করা উচিত সে সম্পর্কে সচেতন না হয়। আমার অভিজ্ঞতায় আমি প্রায়শই বেশ কয়েকটি ভিউ মডেল এবং ব্যবহারকারীর নিয়ন্ত্রণের সংমিশ্রণ দেখতে পাই, যেখানে উইন্ডো প্রায়শই কিছুই না যে রুট ধারক।

টুকিটাকি

public sealed class AttachedProperties
{
    // Define the key gesture type converter
    [System.ComponentModel.TypeConverter(typeof(System.Windows.Input.KeyGestureConverter))]
    public static KeyGesture GetFocusShortcut(DependencyObject dependencyObject)
    {
        return (KeyGesture)dependencyObject?.GetValue(FocusShortcutProperty);
    }

    public static void SetFocusShortcut(DependencyObject dependencyObject, KeyGesture value)
    {
        dependencyObject?.SetValue(FocusShortcutProperty, value);
    }

    /// <summary>
    /// Enables window-wide focus shortcut for an <see cref="UIElement"/>.
    /// </summary>
    // Using a DependencyProperty as the backing store for FocusShortcut.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty FocusShortcutProperty =
        DependencyProperty.RegisterAttached("FocusShortcut", typeof(KeyGesture), typeof(AttachedProperties), new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.None, new PropertyChangedCallback(OnFocusShortcutChanged)));

    private static void OnFocusShortcutChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        if (!(d is UIElement element) || e.NewValue == e.OldValue)
            return;

        var window = FindParentWindow(d);
        if (window == null)
            return;

        var gesture = GetFocusShortcut(d);
        if (gesture == null)
        {
            // Remove previous added input binding.
            for (int i = 0; i < window.InputBindings.Count; i++)
            {
                if (window.InputBindings[i].Gesture == e.OldValue && window.InputBindings[i].Command is FocusElementCommand)
                    window.InputBindings.RemoveAt(i--);
            }
        }
        else
        {
            // Add new input binding with the dedicated FocusElementCommand.
            // see: https://gist.github.com/shuebner20/349d044ed5236a7f2568cb17f3ed713d
            var command = new FocusElementCommand(element);
            window.InputBindings.Add(new InputBinding(command, gesture));
        }
    }
}

এই সংযুক্ত সম্পত্তি দিয়ে আপনি যে কোনও ইউআইইলেমেন্টের জন্য একটি ফোকাস শর্টকাট নির্ধারণ করতে পারেন। এটি স্বয়ংক্রিয়ভাবে উপাদান যুক্ত উইন্ডোতে ইনপুট বাইন্ডিং রেজিস্ট্রেশন করবে।

ব্যবহার (এক্সএএমএল)

<TextBox x:Name="SearchTextBox"
         Text={Binding Path=SearchText}
         local:AttachedProperties.FocusShortcutKey="Ctrl+Q"/>

সোর্স কোড

ফোকাসএলিমেন্ট কম্যান্ড বাস্তবায়ন সহ পুরো নমুনাটি সংক্ষিপ্ত আকারে উপলব্ধ: https://gist.github.com/shuebner20/c6a5191be23da549d5004ee56bcc352d

দাবি অস্বীকার: আপনি এই কোডটি যে কোনও জায়গায় এবং নিখরচায় ব্যবহার করতে পারেন। দয়া করে মনে রাখবেন, এটি ভারী ব্যবহারের জন্য উপযুক্ত নয় এমন একটি নমুনা। উদাহরণস্বরূপ, সরানো উপাদানগুলির কোনও জঞ্জাল সংগ্রহ নেই কারণ কমান্ড উপাদানটির একটি দৃ a় রেফারেন্স রাখবে।


-2

কমান্ডটি কীভাবে একটি সাথে যুক্ত করবেন MenuItem:

<MenuItem Header="My command" Command="{x:Static local:MyWindow.MyCommand}"/>
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.