2009-09-01 88 views
107

Tôi biết về cách sử dụng _ thay vì &, những gì tôi đang xem là tất cả các phím tắt loại Ctrl +.Phím tắt trong WPF

Ctrl +Z cho lùi lại, Ctrl +S cho tiết kiệm, vv

Có cách nào 'tiêu chuẩn' cho việc thực hiện các trong các ứng dụng WPF? Hoặc là nó là một trường hợp cuộn của riêng bạn và dây chúng vào bất cứ điều gì lệnh/kiểm soát?

Trả lời

149

Tôi hiểu cách chuẩn là bằng cách tạo Lệnh và sau đó thêm các phím tắt của bạn vào chúng dưới dạng InputGestures. Điều này cho phép các phím tắt hoạt động ngay cả khi chúng không được kết nối với bất kỳ điều khiển nào. Và vì các mục menu hiểu cử chỉ bàn phím, chúng sẽ tự động hiển thị phím tắt của bạn trong văn bản của các mục menu, nếu bạn móc lệnh đó lên mục menu của bạn.

A. Tạo thuộc tính tĩnh để giữ lệnh (tốt nhất là tài sản trong lớp tĩnh bạn tạo cho lệnh - nhưng đối với ví dụ đơn giản, chỉ cần sử dụng thuộc tính tĩnh trong cs cửa sổ):

public static RoutedCommand MyCommand = new RoutedCommand(); 

B. Thêm (các) phím tắt phải gọi phương thức:

MyCommand.InputGestures.Add(new KeyGesture(Key.S , ModifierKeys.Control)); 

C. Tạo lệnh ràng buộc trỏ đến phương thức để thực thi, đặt các liên kết này cho phần tử giao diện người dùng cần làm việc (ví dụ: , cửa sổ) & phương pháp:

<Window.CommandBindings> 
    <CommandBinding Command="{x:Static local:MyWindow.MyCommand}" Executed="MyCommandExecuted"/> 
</Window.CommandBindings> 

private void MyCommandExecuted(object sender, ExecutedRoutedEventArgs e) { ... } 
+2

Làm cách nào để liên kết lệnh với một mục menu? Chắc chắn đó sẽ là thông tin quan trọng nhất để đưa vào câu trả lời này, nhưng nó bị thiếu. – Timwi

+7

@Timwi: tôi đã sử dụng mã ở trên theo cách này để thêm lối tắt bàn phím vào sự kiện hiện có: RoutedCommand cmndSettings = new RoutedCommand(); cmndSettings.InputGestures.Add (KeyGesture mới (Key.S, ModifierKeys.Control)); CommandBindings.Add (CommandBinding mới (cmndSettings, mnuSettings_Click)); – itsho

+1

nhận xét của itho đã thực hiện công việc này cho tôi, không thể làm cho mã xml ở trên hoạt động. – eightx2

9

Tùy thuộc vào nơi bạn muốn sử dụng chúng. TextBoxBase kiểm soát xuất phát đã triển khai các phím tắt đó. Nếu bạn muốn sử dụng các phím tắt tùy chỉnh, bạn nên xem xét các lệnh và các cử chỉ nhập liệu. Dưới đây là hướng dẫn nhỏ từ Chuyển đổi trên mã: WPF Tutorial - Command Bindings and Custom Commands

Hy vọng điều này sẽ hữu ích.

+5

Hướng dẫn crap là gì - không giải thích điều quan trọng nhất, đó là cách sử dụng lệnh không phải là một trong 20 lệnh "phổ biến" được xác định trước. – Timwi

+3

Thật không may trông giống như liên kết đó đã chết. –

2

VB.Net:

Public Shared SaveCommand_AltS As New RoutedCommand 

Bên nạp sự kiện:

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

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

Không cần XAML.

Hy vọng điều này sẽ hữu ích.

-2

Làm thế nào để kết hợp các lệnh với một MenuItem:

<MenuItem Header="My command" Command="{x:Static local:MyWindow.MyCommand}"/> 
11

Cố Bộ luật này ...

Đầu tiên tạo ra một đối tượng RoutedComand

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

Tư liệu câu trả lời này cho người khác, như có một cách đơn giản hơn nhiều để làm điều này mà hiếm khi được tham chiếu, và không cần chạm vào XAML ở tất cả.

Để liên kết lối tắt bàn phím, trong trình tạo cửa sổ, chỉ cần thêm một KeyBinding mới vào bộ sưu tập InputBindings. Như lệnh, vượt qua trong lớp lệnh tùy ý của bạn thực hiện ICommand. Đối với phương thức thực hiện, chỉ cần thực hiện bất kỳ logic nào bạn cần. Trong ví dụ dưới đây, lớp WindowCommand của tôi nhận một ủy nhiệm rằng nó sẽ thực thi bất cứ khi nào được gọi. Khi tôi xây dựng WindowCommand mới để vượt qua với ràng buộc của tôi, tôi chỉ đơn giản là chỉ ra trong initializer của tôi, phương pháp mà tôi muốn WindowCommand để thực thi.

Bạn có thể sử dụng mẫu này để tìm ra các phím tắt nhanh của riêng bạn.

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))); 
    ... 
} 

Tạo một lớp WindowCommand đơn giản, thực hiện ủy quyền thực hiện để kích hoạt bất kỳ phương pháp nào được đặt trên đó.

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

Siêu. Nó hoạt động hoàn hảo cho kịch bản của tôi ... – Geeth

1

Tôi gặp vấn đề tương tự và tìm thấy câu trả lời của @ aliwa là giải pháp hữu ích và thanh lịch nhất; tuy nhiên, tôi cần một tổ hợp phím cụ thể, Ctrl + 1. Đáng tiếc là tôi đã nhận lỗi sau:

'1' cannot be used as a value for 'Key'. Numbers are not valid enumeration values.

Với một chút tìm kiếm hơn nữa, tôi sửa đổi câu trả lời @ aliwa của những điều sau đây:

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

Tôi thấy điều này để làm việc tuyệt vời cho khá tốt bất kỳ sự kết hợp tôi cần .

Các vấn đề liên quan