2009-05-03 49 views
12

Thay vì gắn một sự kiện PreviewKeyUp với mỗi TextBox trong ứng dụng của tôi và kiểm tra xem phím đã nhấn có phải là phím Enter hay không, hãy quyết định triển khai phiên bản mở rộng của TextBox bao gồm sự kiện DefaultAction kích hoạt khi nhấn phím Enter trong TextBox.WPF: Hộp văn bản có sự kiện kích hoạt khi phím Enter được nhấn

Những gì tôi đã làm được về cơ bản tạo ra một lớp mới mà kéo dài từ TextBox với một sự kiện công cộng DefaultAction, như ví dụ:

public class DefaultTextBoxControl:TextBox 
{ 
    public event EventHandler<EventArgs> DefaultAction = delegate { }; 

    public DefaultTextBoxControl() 
    { 
     PreviewKeyUp += DefaultTextBoxControl_PreviewKeyUp; 
    } 

    void DefaultTextBoxControl_PreviewKeyUp(object sender, System.Windows.Input.KeyEventArgs e) 
    { 
     if (e.Key != Key.Enter) 
     { 
      return; 
     } 
     DefaultAction(this, EventArgs.Empty); 
    } 
} 

sau đó tôi sử dụng hộp tùy chỉnh này từ ứng dụng của tôi như vậy (XAML):

<Controls:DefaultTextBoxControl DefaultAction="DefaultTextBoxControl_DefaultAction"> 
</Controls:DefaultTextBoxControl> 

Bây giờ trong kinh nghiệm nhỏ của tôi tôi đã có trong việc học WPF tôi đã nhận ra rằng gần như hầu hết thời gian có một "mát" (và hy vọng dễ dàng hơn) wa y để triển khai mọi thứ

... vì vậy câu hỏi của tôi là, Làm cách nào để cải thiện điều khiển trên? Hoặc có thể có cách nào khác để tôi có thể thực hiện điều khiển trên không? ... có thể chỉ sử dụng mã khai báo thay vì cả khai báo (xaml) và thủ tục (C#)?

Trả lời

23

Hãy xem this blog post từ một vài tháng trước khi tôi đính kèm trình xử lý sự kiện 'toàn cầu' vào TextBox.GotFocus để chọn văn bản.

Về cơ bản bạn có thể xử lý các sự kiện KeyUp trong lớp ứng dụng của bạn, như thế này:

protected override void OnStartup(StartupEventArgs e) 
{ 
    EventManager.RegisterClassHandler(typeof(TextBox), 
     TextBox.KeyUpEvent, 
     new System.Windows.Input.KeyEventHandler(TextBox_KeyUp)); 

    base.OnStartup(e); 
} 

private void TextBox_KeyUp(object sender, System.Windows.Input.KeyEventArgs e) 
{ 
    if (e.Key != System.Windows.Input.Key.Enter) return; 

    // your event handler here 
    e.Handled = true; 
    MessageBox.Show("Enter pressed"); 
} 

... và bây giờ mỗi TextBox trong ứng dụng của bạn sẽ gọi phương thức TextBox_KeyUp như người dùng gõ vào chúng.

Cập nhật

Như bạn đã chỉ ra trong bình luận của bạn, điều này chỉ hữu ích nếu mỗi TextBox nhu cầu để thực hiện cùng một mã.

Để thêm sự kiện tùy ý như phím Enter, bạn có thể nên xem xét Attached Events. Tôi tin rằng điều này có thể giúp bạn có được những gì bạn muốn.

+0

Nhưng với điều này, làm thế nào để bạn gán những gì sẽ xảy ra khi vào phím được nhấn? bởi vì mỗi TextBox thực hiện một cái gì đó khác nhau –

+0

Oh! Tôi sẽ cập nhật câu trả lời. –

+0

câu trả lời hay nhất! –

12

Vì câu hỏi này được hỏi, hiện tại có thuộc tính InputBindings trên TextBox và các điều khiển khác. Với điều này, một giải pháp XAML thuần túy có thể được sử dụng, thay vì sử dụng các điều khiển tùy chỉnh. Chỉ định KeyBinding s cho ReturnEnter để trỏ đến lệnh có thể thực hiện việc này.

Ví dụ:

<TextBox Text="Test"> 
    <TextBox.InputBindings> 
     <KeyBinding Command="{Binding SomeCommand}" Key="Return" /> 
     <KeyBinding Command="{Binding SomeCommand}" Key="Enter" /> 
    </TextBox.InputBindings> 
</TextBox> 

Một số người nói rằng Enter không luôn luôn làm việc, và Return có thể được sử dụng trên một số hệ thống.

+0

Trông đẹp vì vậy tôi đã thử nó nhưng điều này không hoạt động. Sử dụng một nút lệnh của tôi nhận được kích hoạt với hộp văn bản nó không. Tôi thậm chí còn thêm một Source = {StaticResource viewModel} nhưng không có gì hiệu quả. –

0
private void txtBarcode_KeyDown(object sender, KeyEventArgs e) 
    { 
     string etr = e.Key.ToString(); 

     if (etr == "Return") 
     { 
      MessageBox.Show("You Press Enter"); 
     } 
    } 
+0

Bạn cần cung cấp giải thích về mã của mình – Ibo

0

add sự kiện trong xaml vào textbox hoặc đối tượng cụ thể:

KeyDown="txtBarcode_KeyDown"

0

Khi người dùng nhấn phím Enter trong TextBox, các đầu vào trong hộp văn bản xuất hiện trong một lĩnh vực khác của giao diện người dùng (UI).

XAML sau tạo giao diện người dùng, bao gồm StackPanel, TextBlock và TextBox.

<StackPanel> 
    <TextBlock Width="300" Height="20"> 
    Type some text into the TextBox and press the Enter key. 
    </TextBlock> 
    <TextBox Width="300" Height="30" Name="textBox1" 
      KeyDown="OnKeyDownHandler"/> 
    <TextBlock Width="300" Height="100" Name="textBlock1"/> 
</StackPanel> 

Mã sau đây tạo trình xử lý sự kiện KeyDown. Nếu phím được bấm là phím Enter, một thông báo sẽ được hiển thị trong TextBlock.

private void OnKeyDownHandler(object sender, KeyEventArgs e) 
{ 
    if (e.Key == Key.Return) 
    { 
     textBlock1.Text = "You Entered: " + textBox1.Text; 
    } 
} 

Để biết thêm thông đọc MSDN Doc

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