2009-08-28 37 views
64

Làm thế nào để thiết lập tập trung vào một yếu tố TextBox trong WPFSet tập trung vào textbox trong WPF

tôi có mã này:

txtCompanyID.Focusable = true; 
txtCompanyID.Focus(); 

... nhưng nó không được làm việc.

Bất kỳ ý tưởng nào?

Trả lời

99

Trong XAML:

<StackPanel FocusManager.FocusedElement="{Binding ElementName=Box}"> 
    <TextBox Name="Box" /> 
</StackPanel> 
+7

Tôi thích cách tiếp cận này cho những người khác ở trên vì nó giữ phù hợp với MVVM. –

+1

Phần tử được tập trung chỉ đọc đúng Cách bạn có thể đặt trong xaml? Tôi đã sử dụng tính năng này và nó không hoạt động WPFKK

+0

@ user841612, kiểm tra liên kết sau và xác minh Assembly and Namespace https://msdn.microsoft.com/en-us/library/system.windows.input.focusmanager.focusedelement%28v=vs.110%29. aspx – usefulBee

43

thử FocusManager.SetFocusedElement

FocusManager.SetFocusedElement(parentElement, txtCompanyID) 
+4

Điều gì xảy ra nếu phần tử bạn muốn đặt tiêu điểm * là * phần tử mẹ o.O? –

+7

FocusManager.SetFocusedElement (FocusManager.GetFocusScope (parentElement), parentElement); – Philter

20
txtCompanyID.Focusable = true; 
Keyboard.Focus(txtCompanyID); 

MSDN:

Chỉ có thể có một yếu tố trên toàn bộ máy tính để bàn đã tập trung bàn phím. Trong WPF, phần tử có bàn phím tiêu điểm sẽ được đặt IsKeyboardFocused thành true.

Bạn có thể ngắt sau dòng thiết lập và kiểm tra giá trị của thuộc tính IsKeyboardFocused. Ngoài ra, hãy kiểm tra xem bạn có thực sự đạt được dòng đó hay không hoặc bạn có thể đặt một số yếu tố khác để tập trung sau đó.

15

Hãy thử điều này: MyTextBox.Focus ();

+0

Đây là câu trả lời thanh lịch nhất và không yêu cầu bạn chỉ định cha mẹ. Cảm ơn vì điều này, nó hoạt động tuyệt vời cho tôi! – dbeachy1

7

Không ai trong số này làm việc cho tôi như tôi đã sử dụng một mạng lưới chứ không phải là một StackPanel.

cuối cùng tôi đã tìm thấy ví dụ này: http://spin.atomicobject.com/2013/03/06/xaml-wpf-textbox-focus/

và sửa đổi nó như thế này:

Trong 'Resources' phần:

<Style x:Key="FocusTextBox" TargetType="Grid"> 
     <Style.Triggers> 
      <DataTrigger Binding="{Binding ElementName=textBoxName, Path=IsVisible}" Value="True"> 
       <Setter Property="FocusManager.FocusedElement" Value="{Binding ElementName=textBoxName}"/> 
      </DataTrigger> 
     </Style.Triggers> 
    </Style> 

Trong định nghĩa lưới của tôi:

<Grid Style="{StaticResource FocusTextBox}" /> 
+1

Điều này cũng phù hợp với tôi. Phần còn lại thì không. Cảm ơn bạn đã liên kết, điều đó khá thú vị. Cũng thú vị rằng một điều đơn giản như vậy có thể rất phức tạp. – TravisWhidden

+2

Câu trả lời ở trên hoạt động tốt bất kể nếu vùng chứa là Gird hoặc StackPanel. Vì cấu trúc lưới của bạn không rõ ràng nên khó có thể biết được điều gì đã xảy ra. Tốt đẹp để xem lựa chọn thay thế mặc dù. – usefulBee

+1

Đối với tôi, đây cũng là người duy nhất hoạt động chính xác. Cách tốt đẹp. – OregonGhost

19

Không ai giải thích cho đến nay tại sao mã e trong câu hỏi không hoạt động. Tôi đoán là mã được đặt trong hàm tạo của Cửa sổ. Nhưng tại thời điểm này còn quá sớm để đặt tiêu điểm. Nó phải được thực hiện khi Window đã sẵn sàng để tương tác. Nơi tốt nhất cho mã là sự kiện được tải:

public KonsoleWindow() { 
    public TestWindow() { 
    InitializeComponent(); 
    Loaded += TestWindow_Loaded; 
    } 

    private void TestWindow_Loaded(object sender, RoutedEventArgs e) { 
    txtCompanyID.Focus(); 
    } 
} 
+5

TRẢ LỜI TRƯỚC KHI SỬ DỤNG NÀY – Airhead

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