2009-08-02 26 views
8

Tôi muốn menu chính trong ứng dụng WPF của tôi cư xử giống như menu chính trong IE8:Làm cách nào để chuyển đổi chế độ hiển thị menu chính bằng cách sử dụng phím Alt trong WPF?

  • nó không nhìn thấy được khi ứng dụng bắt đầu
  • ấn và nhả phím Alt làm cho nó có thể nhìn thấy
  • nhấn và phát hành Alt một lần nữa làm cho nó vô hình lại
  • lặp lại cho đến khi chán

làm thế nào tôi có thể làm điều này? Nó có phải là mã không?

gia tăng để đáp ứng với câu trả lời gửi, bởi vì tôi vẫn đang gặp rắc rối:

My Shell code-behind bây giờ trông như thế này:

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); } 
    } 
} 
+1

Bạn muốn bắt chước Internet Explorer ...? –

+0

Tôi cố gắng giữ cho ứng dụng của mình nhất quán với những gì người dùng mong đợi, vì vậy có. :-) – serialhobbyist

+0

Cũng có thể tài khoản cho khóa F10 kích hoạt hành vi tương tự cho tính nhất quán. – genus

Trả lời

8

Bạn có thể sử dụng sự kiện PreviewKeyDown trên cửa sổ. Để phát hiện phím Alt, bạn sẽ cần phải kiểm tra thuộc tính SystemKey của KeyEventArgs, trái với thuộc tính Khóa mà bạn thường sử dụng cho hầu hết các khóa khác.

Bạn có thể sử dụng sự kiện này để đặt giá trị bool đã được khai báo là DependencyProperty trong mã cửa sổ phía sau.

Thuộc tính Visibility của trình đơn sau đó có thể được liên kết với thuộc tính này bằng cách sử dụng BooleanToVisibilityConverter.

<Menu 
    Visibility={Binding Path=IsMenuVisibile, 
     RelativeSource={RelativeSource AncestorType=Window}, 
     Converter={StaticResource BooleanToVisibilityConverter}} 
    /> 
+0

Tôi không thể làm việc này. Tôi đã cập nhật câu hỏi ban đầu với mã phía sau cho DependencyProperty của tôi. Đây là lần đầu tiên tôi tuyên bố của riêng tôi vì vậy ... Tôi đã thêm ràng buộc của bạn vào Menu trong Shell.xaml và lỗi tôi nhận được là: Lỗi System.Windows.Data: 39: Lỗi đường dẫn BindingExpression : 'Không tìm thấy thuộc tính' IsMenuVisibile 'trên' đối tượng '' 'Shell' (Tên = '') '. BindingExpression: Đường dẫn = IsMenuVisibile; DataItem = 'Shell' (Tên = ''); phần tử đích là 'Menu' (Tên = 'uxMainMenu'); thuộc tính mục tiêu là 'Hiển thị' (loại 'Hiển thị'). Ý tưởng nào? – serialhobbyist

+0

Đây là lỗi ràng buộc tiêu chuẩn bạn nhận được khi không tìm thấy thuộc tính. Để khắc phục nó, bạn cần phải thay thế IsMenuVisible bằng IsMainMenuVisible trong ràng buộc của bạn. –

+0

Ồ, tôi là một tên ngốc! Tôi sẽ đăng nhập và sắp xếp nó ra. Cảm ơn. Và cảm ơn vì đã không chỉ ra tôi dày như thế nào. :-) – serialhobbyist

1

Tôi muốn cố gắng nhìn vào xử lý PreviewKeyDown sự kiện trên cửa sổ của bạn. Tôi không chắc liệu nhấn Alt có kích hoạt sự kiện này hay không, nhưng nếu có, thì tôi sẽ chuyển đổi một bool bị ràng buộc với khả năng hiển thị của menu chính của cửa sổ.

Nếu PreviewKeyDown không hoạt động, tôi không chắc nên thử làm gì khác. Bạn có thể xem xét việc nhận được các tin nhắn Windows thực tế được gửi đến cửa sổ của bạn, nhưng điều đó có thể rất lộn xộn.

+0

Cảm ơn bạn đã đề xuất. Tôi đang đi với đề nghị của Phil Price về PreviewKeyUp bởi vì nó gần gũi hơn với IE nhưng nếu không thì nó nghe có vẻ khả thi. – serialhobbyist

1

Nó sẽ là tốt hơn để sử dụng GetKeyboardState với VK_MENU để xử lý cả hai bên trái và phải Alt, để bắt chước hành vi của IE/Windows Explorer (Vista +), bạn sẽ cần phải theo dõi các yếu tố tập trung trước đây để lưu trữ lấy nét, trên một tờ báo VK_MENU trong khi phần tử được lấy nét nằm trong menu chính của bạn. Bạn cũng muốn thực hiện công việc này trên PreviewKeyUp (không hoạt động).

+0

Cảm ơn. Tại mo, tôi thậm chí không thể có được những điều cơ bản đi vì vậy tôi sẽ để lại công cụ WM cho một chút! – serialhobbyist

1

Tôi đã tự mình gặp vấn đề này. Tôi đã cố gắng hooking vào sự kiện PreviewKeyDown, nhưng thấy nó không đáng tin cậy. Thay vào đó, tôi tìm thấy lớp InputManager nơi bạn có thể móc vào mã EnterMenuMode từ mã được quản lý. Người quản lý cho thấy hai sự kiện, để vào và ra. Bí quyết là không thu gọn menu, nhưng đặt chiều cao vùng chứa là 0 khi nó bị ẩn. Để hiển thị nó, chỉ cần xóa giá trị cục bộ và nó sẽ lấy chiều cao trước đó của nó.

Từ kiểm soát của tôi TopMenu sử dụng:

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); 
} 
Các vấn đề liên quan