2012-02-10 22 views
5

Tôi có một vấn đề lạ (có lẽ chỉ để hiểu) tại sao trong một ứng dụng thử nghiệm tập trung rect không được hiển thị cho đến khi tôi bấm phím tab.Tại sao Focus Rectangle không hiển thị cho đến khi nhấn phím Tab?

Tôi muốn hiển thị hộp thoại có hai hộp radio và hai nút. Khi tôi hiển thị hộp thoại, tôi muốn nhìn thấy một tiêu điểm rect xung quanh radiobutton đầu tiên của tôi. (Vì vậy mà người dùng có thể nhìn thấy nơi tập trung được.) Tôi ra lệnh cho các điều khiển và thiết lập các tài sản tabindex 0-4 để chúng được theo thứ tự đúng. (radiobox 1 có tabindex 0, ...)

Khi tôi hiển thị hộp thoại, hộp radio đầu tiên có tiêu điểm, nhưng không có tiêu điểm xoay quanh nó. (Cho đến khi tôi bấm phím tab.)

Tôi đã tạo một dự án winforms hoàn toàn trống (Visual Studio 2010), thêm các điều khiển và khởi động nó. Vì vậy, không có gì đặc biệt cả.

Ai đó có thể cho tôi gợi ý những gì tôi đang làm sai không?

Xin lỗi, đây là đoạn code mẫu của tôi:

Public Class Form1 

Private Sub Button1_Click(sender As System.Object, _ 
    e As System.EventArgs) _ 
    Handles Button1.Click 

    Me.Close() 
End Sub 

Private Sub Button2_Click(sender As System.Object, _ 
    e As System.EventArgs) _ 
    Handles Button2.Click 

    Me.Close() 
End Sub 

Private Sub Form1_Shown(sender As Object, _ 
    e As System.EventArgs) _ 
    Handles Me.Shown 

    RadioButton1.Focus() 
    RadioButton1.Select() 
    SendKeys.SendWait("{TAB}") 
    SendKeys.SendWait("+{TAB}") 

End Sub 

End Class 
+0

Ahem ... Tôi quên nói, mà tôi đang sử dụng Windows 7 (64 bit) – AlexS

+0

Tough lỗi để sửa chữa, không có gì tôi đã cố gắng làm việc. –

+0

Tôi đã nghiên cứu nhiều hơn một chút và phát hiện ra rằng việc gửi một khóa "Tab" tới biểu mẫu sẽ gọi sự kiện Control.ChangeUICues trong đó cờ UICuesEventArgs.ShowFocus được đặt thành true. (http://msdn.microsoft.com/en-us/library/system.windows.forms.control.changeuicues.aspx) Sau khi sự kiện này được xử lý, tập trung rect được hiển thị. Có ai biết, làm thế nào tôi có thể kích hoạt/gọi sự kiện này trực tiếp? Tôi không tìm thấy bất kỳ tài sản mà tôi có thể thiết lập này thành sự thật ... – AlexS

Trả lời

5

Như tôi đã nhận xét, đây thực sự là cài đặt tùy chọn của người dùng.

Nhưng để hiển thị các hình chữ nhật, hãy thử kế thừa RadioButton của riêng bạn và ghi đè lên ShowFocusCues chức năng:

Public Class RadioWithFocus 
    Inherits RadioButton 

    Protected Overrides ReadOnly Property ShowFocusCues() As Boolean 
    Get 
     Return True 
    End Get 
    End Property 

End Class 
1

Sử dụng kế thừa Control.Focus() trong phương thức khởi tạo của mẫu của bạn, hoặc bất cứ nơi nào áp dụng. Một cái gì đó như:

public Form1() { 
    //Other stuff here 
    radiobox1.Focus();// If this is the name of your control 
} 

Một phương pháp khác để xem là Form.Activate. Điều này có thể tốt hơn để sử dụng trong ngữ cảnh này

Ngoài ra, ActiveControl có thể hữu ích.

+0

Tôi biết Phương pháp lấy nét và đã thử nó trước tiên. Phương thức .Activate của bạn là một ý tưởng hay, nhưng không phải là lừa. : -/ – AlexS

+0

xem chỉnh sửa của tôi .... – annonymously

0

Như LarsTech đã nói, đây là một thiết lập người dùng. Đối với Windows 7, bạn có thể tìm thấy cài đặt này tại đây: Mở Bảng điều khiển/Dễ truy cập Trung tâm/Giúp Bàn phím dễ sử dụng hơn.

Tìm hộp kiểm có nội dung "Phím tắt và phím truy cập gạch chân" và kiểm tra.

Chạy lại ứng dụng của bạn và bạn sẽ thấy rằng các trọng tâm sẽ hiển thị khi biểu mẫu của bạn tải lần đầu tiên.

Thưởng thức

0

Đối với Win32/C++, gửi tin nhắn WM_CHANGEUISTATE đến cửa sổ cha mẹ:

// Enable focus rect and accelerator underline in all controls. 
    ::SendMessage(WM_CHANGEUISTATE, MAKELONG(UIS_CLEAR, UISF_HIDEACCEL | UISF_HIDEFOCUS), 0); 
Các vấn đề liên quan