كيف يمكنني تبديل رؤية القائمة الرئيسية باستخدام مفتاح Alt في WPF؟

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

سؤال

أرغب في أن تعمل القائمة الرئيسية في تطبيق 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);
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top