كيف يمكنني تبديل رؤية القائمة الرئيسية باستخدام مفتاح Alt في WPF؟
-
10-07-2019 - |
سؤال
أرغب في أن تعمل القائمة الرئيسية في تطبيق WPF مثل القائمة الرئيسية في IE8:
- لا يكون مرئيًا عند بدء تشغيل التطبيق
- الضغط على Alt والإفراج عنه يجعله مرئيًا
- الضغط على Alt وإطلاقه مرة أخرى يجعله غير مرئي مرة أخرى
- كرر حتى تشعر بالملل
كيف يمكنني أن أفعل هذا؟هل يجب أن يكون رمزًا؟
تمت الإضافة ردًا على الإجابات المقدمة، لأنني ما زلت أواجه مشكلة:
يبدو رمز Shell الخاص بي الآن كما يلي:
public partial class Shell : Window
{
public static readonly DependencyProperty IsMainMenuVisibleProperty;
static Shell()
{
FrameworkPropertyMetadata metadata = new FrameworkPropertyMetadata();
metadata.DefaultValue = false;
IsMainMenuVisibleProperty = DependencyProperty.Register(
"IsMainMenuVisible", typeof(bool), typeof(Shell), metadata);
}
public Shell()
{
InitializeComponent();
this.PreviewKeyUp += new KeyEventHandler(Shell_PreviewKeyUp);
}
void Shell_PreviewKeyUp(object sender, KeyEventArgs e)
{
if (e.SystemKey == Key.LeftAlt || e.SystemKey == Key.RightAlt)
{
if (IsMainMenuVisible == true)
IsMainMenuVisible = false;
else
IsMainMenuVisible = true;
}
}
public bool IsMainMenuVisible
{
get { return (bool)GetValue(IsMainMenuVisibleProperty); }
set { SetValue(IsMainMenuVisibleProperty, value); }
}
}
المحلول
يمكنك استخدام ال PreviewKeyDown
الحدث على النافذة.للكشف عن بديل المفتاح الذي ستحتاجه للتحقق من SystemKey
ملكية KeyEventArgs
, ، على عكس خاصية المفتاح التي تستخدمها عادةً لمعظم المفاتيح الأخرى.
يمكنك استخدام هذا الحدث لتعيين bool
القيمة التي تم الإعلان عنها كـ a DependencyProperty
في رمز ويندوز وراء.
القائمة Visibility
يمكن بعد ذلك ربط الخاصية بهذه الخاصية باستخدام BooleanToVisibilityConverter
.
<Menu
Visibility={Binding Path=IsMenuVisibile,
RelativeSource={RelativeSource AncestorType=Window},
Converter={StaticResource BooleanToVisibilityConverter}}
/>
نصائح أخرى
سأحاول النظر في التعامل مع PreviewKeyDown
الحدث على نافذتك.لست متأكدًا مما إذا كان الضغط على Alt يؤدي إلى تشغيل هذا الحدث أم لا، ولكن إذا حدث ذلك، فسأقوم بتبديل bool
والذي يرتبط برؤية القائمة الرئيسية للنافذة.
لو PreviewKeyDown
لا يعمل، لست متأكدًا مما يجب تجربته أيضًا.يمكنك النظر في الحصول على رسائل Windows الفعلية المرسلة إلى نافذتك، ولكن قد يصبح ذلك فوضويًا بسرعة كبيرة.
سيكون من الأفضل استخدامها GetKeyboardState
مع VK_MENU
للتعامل مع كل من اليسار واليمين بديل, ، لتقليد سلوك IE / Windows Explorer (Vista+)، ستحتاج إلى تتبع العنصر الذي تم التركيز عليه مسبقًا لتخزين التركيز، على VK_MENU
اضغط بينما يكون العنصر الذي تم التركيز عليه موجودًا في القائمة الرئيسية.أنت أيضًا تريد أن تقوم بهذا العمل PreviewKeyUp
(ليس لأسفل).
لقد واجهت هذه المشكلة بنفسي.حاولت الربط في PreviewKeyDown
الحدث، ولكن وجدت أنه لا يمكن الاعتماد عليها.بدلا من ذلك وجدت InputManager
فئة حيث يمكنك ربط في EnterMenuMode
من التعليمات البرمجية المدارة.يعرض المدير حدثين للدخول والخروج.الحيلة هي عدم طي القائمة، ولكن ضبط ارتفاع الحاوية الخاصة بها على الصفر عندما تكون مخفية.ولإظهارها، ما عليك سوى مسح القيمة المحلية وستأخذ ارتفاعها السابق.
من وجهة نظري TopMenu
تحكم المستخدم:
public TopMenu()
{
InitializeComponent();
InputManager.Current.EnterMenuMode += OnEnterMenuMode;
InputManager.Current.LeaveMenuMode += OnLeaveMenuMode;
Height = 0;
}
private void OnLeaveMenuMode(object sender, System.EventArgs e)
{
Height = 0;
}
private void OnEnterMenuMode(object sender, System.EventArgs e)
{
ClearValue(HeightProperty);
}