Bạn có thể giải quyết vấn đề này với xác minh tiếp theo:
private void myComboBox_GotFocus(object sender, RoutedEventArgs e)
{
if (e.OriginalSource.GetType() == typeof(ComboBoxItem))
return;
//Your code here
}
Mã này sẽ lọc tất cả các sự kiện tập trung từ các mặt hàng (vì họ sử dụng sự kiện định tuyến bong bóng). Nhưng có một vấn đề khác - hành vi cụ thể của WPF ComboBox tập trung: khi bạn mở danh sách thả xuống với các mục ComboBox của bạn mất tập trung và các mục nhận được. Khi bạn chọn một số mục - mục mất tiêu điểm và ComboBox sẽ quay lại. Danh sách thả xuống giống như một điều khiển khác. Bạn có thể thấy điều này bằng cách mã đơn giản:
private void myComboBox_GotFocus(object sender, RoutedEventArgs e)
{
if (e.OriginalSource.GetType() != typeof(ComboBoxItem))
{
Trace.WriteLine("Got " + DateTime.Now);
}
}
private void myComboBox_LostFocus(object sender, RoutedEventArgs e)
{
if (e.OriginalSource.GetType() != typeof(ComboBoxItem))
{
Trace.WriteLine("Lost " + DateTime.Now);
}
}
Vì vậy, bạn sẽ nhận được ít nhất hai sự kiện nào tập trung: khi bạn chọn ComboBox và khi bạn chọn một cái gì đó trong nó (tập trung sẽ trở lại ComboBox).
Để lọc tiêu điểm được trả về sau khi chọn mục, bạn có thể thử sử dụng các sự kiện DropDownOpened
/DropDownClosed
với một số cờ trường.
Vì vậy, các mã cuối cùng với chỉ 1 trường hợp nhận được tập trung:
private bool returnedFocus = false;
private void myComboBox_GotFocus(object sender, RoutedEventArgs e)
{
if (e.OriginalSource.GetType() != typeof(ComboBoxItem) && !returnedFocus)
{
//Your code.
}
}
private void myComboBox_LostFocus(object sender, RoutedEventArgs e)
{
if (e.OriginalSource.GetType() != typeof(ComboBoxItem))
{
ComboBox cb = (ComboBox)sender;
returnedFocus = cb.IsDropDownOpen;
}
}
Chọn từ ví dụ này những gì bạn thực sự cần hơn cho ứng dụng của bạn.
Nguồn
2011-03-08 20:04:44
thông tin tốt trong câu hỏi này khác. http://stackoverflow.com/questions/830510/issue-with-wpf-focus [link] (http://stackoverflow.com/questions/830510/issue-with-wpf-focus) – Mikeb