2009-09-03 37 views
10

Vì vậy, về cơ bản, tôi có một loạt các TextBoxes mà người dùng nhận được để điền vào. Tôi đã có một nút mà tôi muốn giữ cho đến khi tất cả các TextBoxes đã có văn bản được nhập vào chúng. Đây là một mẫu XAML TextBox mà tôi đang sử dụng:WPF: Hộp văn bản không kích hoạt sự kiệnTextInput

<TextBox Name="DelayedRecallScore" TextInput="CheckTextBoxFilled" Width="24" /> 

Và đây là chức năng mà tôi đang cố gắng để kích hoạt:

//Disables the OK button until all score textboxes have content 
    private void CheckTextBoxFilled(object sender, RoutedEventArgs e) 
    { 
     /* 
     foreach (TextBox scorebox in TextBoxList) 
     { 
      if (string.IsNullOrEmpty(scorebox.Text)) 
      { 
       Ok_Button.IsEnabled = false; 
       return; 
      } 
     } 
     Ok_Button.IsEnabled = true; 
     */ 
     MessageBox.Show("THIS MAKES NO SENSE"); 
    } 

Các MessageBox không hiển thị khi TextInput nên được nhận được kích hoạt. Như một thử nghiệm tôi đã thử kích hoạt CheckTextBoxFilled() trên PreviewTextInput, và nó hoạt động tốt sau đó, có nghĩa là vì lý do gì đó, chức năng này không được gọi. Tôi cũng có một hàm xác nhận được kích hoạt bởi PreviewTextInput, hoạt động như nó cần. Lúc đầu, tôi nghĩ rằng PreviewTextInput bằng cách nào đó có thể can thiệp với TextInput, vì vậy tôi đã PreviewTextInput ra khỏi TextBox, nhưng điều đó đã không quản lý để sửa chữa bất cứ điều gì. Tôi hoàn toàn bị quấy rầy bởi lý do tại sao điều này có thể xảy ra, vì vậy bất kỳ trợ giúp nào cũng sẽ được đánh giá cao.

+0

điều gì đã xảy ra với đại biểu đa phương tiện? tại sao nó sẽ không cháy người dùng được giao sự kiện ngoài của riêng mình? –

Trả lời

11

Trình xử lý của bạn cho sự kiện TextInput không được kích hoạt vì TextBox đang xử lý sự kiện. Bạn có thể thử sử dụng sự kiện TextChanged thay vì, thực sự bạn chỉ muốn biết khi nào các ký tự được thêm vào hoặc bị xóa khỏi số TextBox.

+2

Tôi không biết điều đó, cảm ơn. Tôi chỉ đoán rằng vì PreviewTextInput đã làm việc theo cách đó, nên không có gì ngăn TextInput hoạt động theo cùng một cách. TextChanged hoạt động tốt. –

+1

WPF thực sự thích làm những gì nên đơn giản là nhiệm vụ quá khó khăn. Ý tôi là, tại sao phơi bày một sự kiện nếu nó sẽ không bao giờ cháy? Vô lý ... vâng, tôi đang mạo hiểm: D –

+0

@Ed FWIW, nếu bạn phân lớp TextBox, thì bạn có thể xử lý sự kiện. Nhưng tôi thấy quan điểm của bạn. – Andy

5
InitializeComponent(); 
textbox.AddHandler(TextBox.TextInputEvent, 
        new TextCompositionEventHandler(TextBox_TextInput_1), 
        true); 
+0

điều này không chiếm một không gian. Sự kiện không được kích hoạt. – Mike

0

Tạo lớp mới có nguồn gốc từ TextBox. Trong lớp mới ghi đè lên phương thức OnTextInput. Phương thức OnTextInput của bạn sẽ được gọi trước khi TextBox nhận được nó.

0

Sử dụng "PreviewTextInput" để thay thế, nó sẽ hoạt động.

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