Đặt tiêu điểm vào hộp văn bản trong WPF


105

Cách đặt tiêu điểm vào một TextBoxphần tử trong WPF

Tôi có mã này:

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

... nhưng nó không hoạt động.

Bất kỳ ý tưởng?


txtCompanyID.Focusable = true; Bàn phím.Focus (txtCompanyID); nó hoạt động nhưng đây là cách.
MindRoasterMir

Câu trả lời:


145

Trong XAML:

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

9
Tôi thích cách tiếp cận này hơn những cách khác ở trên vì nó phù hợp với MVVM.
Todd Sprang

1
Phần tử tập trung chỉ đọc đúng Làm thế nào bạn có thể đặt trong xaml? Tôi đã sử dụng cái này và nó không hoạt động <Style.Triggers> <Trigger Property = "Validation.HasError" Value = "True"> <Setter Property = "FocusManager.FocusedElement" Value = "{Binding Source = {RelativeSource Self}}" /> </Trigger> </Style.Triggers>
WPFKK

@ user841612, hãy kiểm tra liên kết sau và xác minh Assembly và Không gian tên msdn.microsoft.com/en-us/library/…
íchBee

Điều này chỉ hoạt động một lần. Nếu bạn muốn thay đổi tiêu điểm sau khi trang đã được tạo xong, bạn cần thực hiện nó theo chương trình.
Joe Steele

điều này cũng hoạt động. txtCompanyID.Focusable = true; Bàn phím.Focus (txtCompanyID);
MindRoasterMir

51

Không ai giải thích cho đến nay tại sao mã 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 Window. Nhưng tại thời điểm này, còn quá sớm để đặt trọng tâm. Nó phải được thực hiện khi Cửa sổ đã sẵn sàng để tương tác. Nơi tốt nhất cho mã là sự kiện Đã tải:

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

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

1
về mặt logic, sau quá nhiều đấu tranh, câu trả lời này là khá tốt và hoàn hảo như một giải pháp.
shivani

điều này đã làm việc cho tôi. câu trả lời được chấp nhận là không. Cảm ơn
BoundForGlory

không chắc nếu phiên bản cụ thể, nhưng Focus()yêu cầu tham số trạng thái tiêu điểm - ví dụtxtCompanyId.Focus(FocusState.Keyboard)
Dan


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

msdn:

Chỉ có thể có một phần tử trên toàn bộ màn hình có tiêu điểm bàn phím. Trong WPF, phần tử có tiêu điểm bàn phí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 IsKeyboardFocusedtính. Ngoài ra, hãy kiểm tra xem bạn có thực sự đạt đến dòng đó hay không hoặc có thể bạn đặt một số yếu tố khác để lấy nét sau đó.


19

Thử cái này : MyTextBox.Focus ( );


2
Đây là câu trả lời thanh lịch nhất và nó không yêu cầu bạn chỉ định phụ huynh. Cảm ơn vì điều này, nó hoạt động rất tốt cho tôi!
dbeachy1

Câu trả lời Peter Huber của thực hiện điều này nhưng giải thích rằng cửa sổ cần phải được nạp đầu tiên, đó là lý do tôi đã không làm việc
Adriaan Davel

14

Không điều gì trong số này phù hợp với tôi vì tôi đang sử dụng lưới chứ không phải là 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ó thành cái này:

Trong phần 'Tài nguyê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}" />

2
Điều này cũng làm việc cho tôi. Phần còn lại thì không. Cảm ơn vì 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ể phức tạp như vậy.
TravisWhiised

2
Câu trả lời trên hoạt động tốt bất kể vùng chứa là Gird hay StackPanel. Vì cấu trúc lưới của bạn không rõ ràng, nên rất khó để biết điều gì có thể đã xảy ra. Rất vui khi thấy các lựa chọn thay thế.
hữu íchBee

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

7

Trong trường hợp bạn không tìm thấy giải pháp cho các câu trả lời khác, đó là cách tôi giải quyết vấn đề.

Application.Current.Dispatcher.BeginInvoke(new Action(() =>
{
    TEXTBOX_OBJECT.Focus();
}), System.Windows.Threading.DispatcherPriority.Render);

Từ những gì tôi hiểu, các giải pháp khác có thể không hoạt động vì lệnh gọi tới Focus()được gọi trước khi ứng dụng hiển thị các thành phần khác.


3
Câu trả lời này xứng đáng được xếp hạng tốt hơn.
Simon Mourier

0

Một giải pháp khả thi khác là sử dụng FocusBehavior được cung cấp bởi DevExpress MVVM Framework miễn phí :

<TextBox Text="This control is focused on startup">
    <dxmvvm:Interaction.Behaviors>
        <dxmvvm:FocusBehavior/>
    </dxmvvm:Interaction.Behaviors>
</TextBox>

Nó cho phép bạn tập trung một điều khiển khi nó được tải, khi một sự kiện nhất định được nâng lên hoặc một thuộc tính được thay đổi.


0

Trong Code đằng sau bạn có thể đạt được nó chỉ bằng cách làm điều này.

 private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            txtIndex.Focusable = true;
            txtIndex.Focus();
        }

Lưu ý: Nó sẽ không hoạt động trước khi cửa sổ được tải

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.