যদিও শীর্ষস্থানীয় উত্তরগুলি সঠিক, আমি ব্যক্তিগতভাবে সংযুক্ত বৈশিষ্ট্যগুলির সাথে কাজ করতে পছন্দ করি যাতে সমাধানটি যে কোনওটিতে প্রয়োগ করা যায় 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় রেফারেন্স রাখবে।