Cách đặt tiêu điểm vào một TextBox
phầ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?
Cách đặt tiêu điểm vào một TextBox
phầ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?
Câu trả lời:
Trong XAML:
<StackPanel FocusManager.FocusedElement="{Binding ElementName=Box}">
<TextBox Name="Box" />
</StackPanel>
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();
}
}
Focus()
yêu cầu tham số trạng thái tiêu điểm - ví dụtxtCompanyId.Focus(FocusState.Keyboard)
hãy thử FocusManager.SetFocusedElement
FocusManager.SetFocusedElement(parentElement, txtCompanyID)
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 IsKeyboardFocused
tí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 đó.
Thử cái này : MyTextBox.Focus ( );
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}" />
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.
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.
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