2010-10-19 24 views
5

Tôi có một điều khiển tab và một vài mục tab. Tôi đang nghe thành công sự kiện SelectionChanged và kiểm tra xem tab tôi quan tâm có phải là tab đang được chọn hay không.Tab WPFControl On SelectionChanged, đặt tiêu điểm thành trường văn bản

Tôi đang sử dụng mã này (bên dưới) và bước qua trình gỡ lỗi, tôi có thể thấy rằng logic phân nhánh của tôi hoạt động như được thiết kế; tuy nhiên, vấn đề tôi gặp phải là một cái gì đó đang ghi đè cuộc gọi này đến txt.Focus() vì sau khi mục tab chính xác được hiển thị, tiêu điểm không nằm trên hộp văn bản.

private void tabMain_SelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
    // exact same behavior with and without this line 
    e.Handled = true; 

    if (e.AddedItems.Contains(usrTab)) 
    { 
     txtusr.Focus(); 
    } 
    else if (e.AddedItems.Contains(svcTab)) 
    { 
     txtsvc.Focus(); 
    } 
} 

Nếu tôi chỉ đặt txtusr.Focus() trong trình xử lý sự kiện nút, nó tập trung chính xác như tôi mong đợi.

Tôi nghi ngờ rằng điều này phải làm với nội dung tabitem không được tải tại thời điểm phương pháp .Focus() được gọi, nhưng tôi không chắc chắn làm thế nào để đi về sửa chữa nó.

+0

Bạn đã phân tách sự cố bên ngoài mã của mình để xem liệu mã có thể lặp lại không? Nếu vậy, đó là vấn đề về thời gian/khung và sau đó bạn có thể tiếp cận vấn đề một chút khác biệt với kiến ​​thức đó trong tay. –

+0

Tôi đã có thể tái tạo không chính xác điều này trong một chương trình sơ khai. – Nate

Trả lời

10

Thử đặt các cuộc gọi .Focus() bên trong bộ điều phối.BeginInvoke.

Dispatcher.BeginInvoke(new Action(() => { txtsvc.Focus(); })); 
+0

Tôi đã không nhận được một ngoại lệ luồng, nhưng điều này đã khắc phục vấn đề. Cảm ơn. – Nate

+2

Yah, trong trường hợp này nó không thực sự về chủ đề. Một số điều khiển sử dụng Dispatcher.Invoke/BeginInvoke trong nội bộ. Bằng cách thêm nhiệm vụ của bạn vào cuối hàng đợi Bộ điều phối, bạn cho phép mọi thứ trước khi nó kết thúc (miễn là nhiệm vụ của bạn có mức độ ưu tiên bằng hoặc thấp hơn mọi thứ khác). Đó là sự hiểu biết của tôi ít nhất. – mdm20

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