2011-10-17 27 views
11

Tôi muốn gọi một lệnh sử dụng EventTrigger khi một phím đặc biệt được chạm (ví dụ, phím spacebar)Sử dụng EventTrigger trên cụ thể chính

Hiện nay tôi có:

<i:Interaction.Triggers> 
     <i:EventTrigger EventName="KeyDown"> 
      <i:InvokeCommandAction Command="{Binding DoCommand}" CommandParameter="{BindingText}"/> 
     </i:EventTrigger> 
    </i:Interaction.Triggers> 

Bây giờ làm sao có thể Tôi xác định rằng điều này sẽ xảy ra chỉ khi KeyDown xảy ra với phím dài?

Trả lời

12

Bạn sẽ phải xây dựng một Trigger tùy chỉnh để xử lý rằng:

public class SpaceKeyDownEventTrigger : EventTrigger { 

    public SpaceKeyDownEventTrigger() : base("KeyDown") { 
    } 

    protected override void OnEvent(EventArgs eventArgs) { 
     var e = eventArgs as KeyEventArgs; 
     if (e != null && e.Key == Key.Space) 
      this.InvokeActions(eventArgs); 
    } 
} 
+0

cảm ơn câu trả lời của bạn, mặc dù tôi vẫn không thể làm cho nó hoạt động. Tôi đã thay đổi XAML của mình để sử dụng 'SpaceKeyDownEventTrigger' (thay vì chỉ' EventTrigger') nhưng 'OnEvent' không được nhập vào. Có điều gì khác tôi nên thay đổi trong XAML của tôi không? Thx lần nữa –

+0

@ lost_bits1110 - Bạn có thể vui lòng cập nhật câu hỏi của mình để bao gồm một ví dụ đầy đủ không? Bạn có chắc chắn sự kiện KeyDown đang kích hoạt cho điều khiển được liên kết không? – CodeNaked

+0

yep trong bài đăng gốc của tôi sự kiện đang được kích hoạt để kiểm soát liên quan, nhưng đã xảy ra cho mỗi sự kiện quan trọng xuống. Tôi chỉ muốn nó xảy ra trên một khóa được chỉ định. Tôi đã thêm một lớp EventTrigger tùy chỉnh như bạn đã đăng, và đơn giản là thay đổi XAML của tôi để thay thế EventTrigger bằng SpakeKeyDownEventTrigger, nhưng có vẻ như tôi cần thêm một cái gì đó hơn –

11

cách tiếp cận khác sẽ được sử dụng keybindings và ràng buộc họ Window của bạn, UserControl, FrameworkElement, vv Đó sẽ không kích hoạt một nút, nhưng nói rằng bạn có một lệnh "MyCommand" được gọi từ nút, bạn có thể gọi lệnh từ InputBindings.

<UserControl.InputBindings> 
    <KeyBinding Command="{Binding Path=ApplyCommand}" Key="Enter"/> 
    <KeyBinding Command="{Binding Path=NextPage}" Modifiers="Ctrl" Key="Left"/> 
</UserControl.InputBindings> 

<StackPanel> 
    <Button IsDefault="True" Content="Apply"> 
     <i:Interaction.Triggers> 
      <i:EventTrigger EventName="Click"> 
       <i:InvokeCommandAction Command="{Binding Path=ApplyCommand}" />        
      </i:EventTrigger> 
     </i:Interaction.Triggers> 
    </Button> 
</StackPanel> 

Bạn cũng có thể liên kết các KeyBindings này với TextBox.

+1

Tôi thích giải pháp này vì nó cho phép tôi giữ hầu như tất cả mã của tôi trong xaml để xử lý các tương tác chính. Tôi hiện đang làm việc trên một nhãn TextBlock/TextBox có thể chỉnh sửa và làm theo cách này cho phép tôi tạo một kiểu có thể chỉnh sửa mới mà tôi có thể áp dụng cho bất kỳ nhãn nào về sau. Đơn giản và thanh lịch. Cảm ơn Kalisohn !! –

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