2008-10-13 49 views
14

Trong WPF, có hai cách để đặt tiêu điểm thành một phần tử.
Bạn có thể gọi phương thức .Focus() của yếu tố đầu vào hoặc gọi Keyboard.Focus() với phần tử đầu vào làm tham số.Whats sự khác biệt giữa Keyboard.Focus (mục) và item.Focus()?

// first way: 
item.Focus(); 
// alternate way: 
Keyboard.Focus(item); 

Sự khác biệt giữa hai điều này là gì? Có lý do đặc biệt nào để sử dụng một trong số chúng thay vì cái khác trong một số trường hợp không?
Cho đến nay tôi nhận thấy không có sự khác biệt - phương pháp nào tôi từng sử dụng, mục luôn có tiêu điểm hợp lý cũng như tiêu điểm bàn phím.

Trả lời

23

Một trong những điều đầu tiên mà item.Focus() làm là gọi Keyboard.Focus(this). Nếu điều đó không thành công, sau đó nó thực hiện cuộc gọi đến FocusManager, như decasteljau đã trả lời.

Các mục sau được sao chép từ chế độ xem của người bỏ dõi trong Reflector.

Đây là từ UIElement (UIElement3D là như nhau):

public bool Focus() 
{ 
    if (Keyboard.Focus(this) == this) 
    { 
     return true; 
    } 
    if (this.Focusable && this.IsEnabled) 
    { 
     DependencyObject focusScope = FocusManager.GetFocusScope(this); 
     if (FocusManager.GetFocusedElement(focusScope) == null) 
     { 
      FocusManager.SetFocusedElement(focusScope, this); 
     } 
    } 
    return false; 
} 

Đây là từ ContentElement:

public bool Focus() 
{ 
    return (Keyboard.Focus(this) == this); 
} 
5

Theo WPF documentation on MSDN:

Trong WPF có hai khái niệm chính liên quan đáng chú ý: bàn phím tập trung và tập trung logic. Tiêu điểm bàn phím đề cập đến phần tử nhận đầu vào bàn phím và tiêu điểm lôgic đề cập đến phần tử trong phạm vi tiêu điểm có tiêu điểm.

Một yếu tố đó đã tập trung bàn phím cũng sẽ có trọng tâm hợp lý, nhưng một phần tử có trọng tâm logic không nhất thiết phải tập trung bàn phím.

+0

Vì vậy, nó sẽ là tốt hơn để sử dụng Keyboard.Focus()? Lạ, mặc dù, khi tôi sử dụng item.Focus() tiêu điểm bàn phím luôn luôn có mặt trên mặt hàng, quá. – Sam

+0

Những người khác nói khá nhiều điều tương tự như tôi đã làm, chỉ với các mẫu mã (yay!). Dunno tại sao điều này lại bị bỏ phiếu ... – Tomalak

+0

Tôi cũng không nhận được phiếu giảm giá. Sự khác biệt giữa tiêu điểm bàn phím và logic là thông tin tốt. –

-1

Ngoài ra, bạn có thể muốn biết rằng item.Focus() là tương đương với cách gọi:

DependencyObject focusScope = FocusManager.GetFocusScope(item); 
if (FocusManager.GetFocusedElement(focusScope) == null) 
{ 
    FocusManager.SetFocusedElement(focusScope, item); 
} 
+0

'setFocusedElement' chỉ đặt tiêu điểm hợp lý. 'Focus()' có thể làm cả bàn phím và logic – EricG

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