Lệnh cho WPF TextBox kích hoạt khi chúng ta nhấn Enter Key


76

Rất dễ ràng buộc Buttoncác s trong ứng dụng WPF vớiCommand các trong một VIEWMODELlớp. Tôi muốn đạt được một ràng buộc tương tự cho a TextBox.

Tôi có một khẩu súng TextBoxvà tôi cần gắn nó vào một khẩu Commandsúng sẽ phát nổ khi tôi bắn trúng Entertrong khi khẩu TextBoxsúng được lấy nét. Hiện tại, tôi đang sử dụng trình xử lý sau cho KeyUpsự kiện, nhưng nó trông xấu ... và tôi không thể đặt nó vàoVIEWMODEL lớp .

private void TextBox_KeyUp(object sender, KeyEventArgs e)
{
    if (e.Key == System.Windows.Input.Key.Enter)
    {
        // your event handler here
        e.Handled = true;
        MessageBox.Show("Enter Key is pressed!");
    }
}

Có cách nào tốt hơn để làm điều này?

Câu trả lời:


20

Aryan, không phải mọi đối tượng WPF đều hỗ trợ lệnh. Vì vậy, nếu bạn không thể làm điều đó, bạn sẽ cần gọi mô hình chế độ xem của mình từ mã phía sau (được ghép đôi một chút) hoặc sử dụng một số triển khai MVVM Messaging để tách biệt điều đó. Xem bộ công cụ Nhắn tin Ánh sáng MVVM để làm ví dụ. Hoặc các trình kích hoạt sử dụng đơn giản như sau:

<TextBox>
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="KeyUp">
            <i:InvokeDataCommand Command="{Binding MyCommand}"/>
        </i:EventTrigger>
    </i:Interaction.Triggers>
</TextBox>

Ok, cảm ơn bạn rất nhiều vì đã trả lời .... nhưng lệnh này sẽ kích hoạt trên mỗi sự kiện key up hay chỉ một sự kiện ENTER key up ??
Aryan SuryaWansi

Mỗi lần. Nếu bạn wan't chỉ cho nhập sau đó bạn sẽ phải viết một phần mở rộng đánh dấu để làm điều đó, như thế này một: tomlev2.wordpress.com/2009/03/17/...
Erre Efe

3
Xem đây là ví dụ tốt đẹp tôi đã tìm thấy trên đây
Aryan SuryaWansi

1
Cảm ơn. Trình kích hoạt sự kiện hiện tại là <i: InvokeCommandAction Command = "{Binding QuickSearchTextKeyUp}" />
Nexxas

cách áp dụng trình kích hoạt này trên nhiều hộp văn bản
Meer

236

Tôi đã đối mặt với cùng một vấn đề và đã tìm thấy giải pháp ở đây , đây là mẫu mã:

<TextBox>
  <TextBox.InputBindings>
    <KeyBinding Command="{Binding Path=CmdSomething}" Key="Enter" />
  </TextBox.InputBindings>
</TextBox>

16
NB bạn có thể cần thiết lập UpdateSourceTrigger=PropertyChangedliên kết TextBox của mình để điều này hoạt động.
Richard Dingwall

đó là dễ dàng ngu ngốc. ngoại trừ nó không làm việc cho AutoCompleteBox từ WPF Toolkit - cho rằng thấy điều này stackoverflow.com/questions/4996731
Simon_Weaver

4
Richard Dingwall nói sự thật khủng khiếp. những gì chúng ta cần là 2 thứ: (1) Button.IsDefault = "True" (2) TextBox Text Binding thêm "UpdateSourceTrigger = PropertyChanged". chỉ có bấy nhiêu thôi. thậm chí câu trả lời của sarh không được sử dụng.
Haiyuan Li

1
@HaiyuanLi: Button.IsDefaultkhông giúp được gì nhiều, nếu mỗi hộp văn bản kích hoạt một nút và / hoặc lệnh liên kết khác nhau.
Ben Voigt

Điều này không hoạt động ở tất cả. 'UpdateSourceTrigger' được đặt thành 'PropertyChanged'. Tôi sử dụng lệnh tương tự cho một nút trong cùng một lưới nhưng hộp văn bản không kích hoạt nó.
Matthis Kohli

16

Tôi thích câu trả lời của Sarh, nhưng nó sẽ không hoạt động trong chương trình của tôi, trừ khi tôi thay đổi Enterthành Return:

<TextBox>
    <TextBox.InputBindings>
        <KeyBinding Key="Return" Command="{}" />
   </TextBox.InputBindings>
</TextBox>

Tôi đã thực hiện trải nghiệm tương tự
Heinz Kessler

1
<TextBox Text="{Binding FieldThatIAmBindingToo, UpdateSourceTrigger=PropertyChanged}">
    <TextBox.InputBindings>
        <KeyBinding Command="{Binding AddCommand}" Key="Return" />
    </TextBox.InputBindings>
</TextBox>

Tôi đã trả lời từ đây


-9

Bạn có thể đặt true cho thuộc tính AcceptReturn.

 <TextBox AcceptsReturn="True" />

12
Tất cả những gì làm được là cho phép hộp văn bản có nhiều dòng và tự xử lý việc nhấn phím, thay vì kích hoạt hành động nút mặc định.
Rudi Visser
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.