Atur fokus pada kotak teks di WPF


105

Cara mengatur fokus pada TextBoxelemen di WPF

Saya memiliki kode ini:

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

... tapi tidak berhasil.

Ada ide?


txtCompanyID.Focusable = true; Keyboard.Focus (txtCompanyID); itu berhasil tapi begini caranya.
MindRoasterMir

Jawaban:


145

Di XAML:

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

9
Saya lebih suka pendekatan ini daripada yang lain di atas karena sejalan dengan MVVM.
Todd Sprang

1
Elemen fokus hanya baca benar Bagaimana Anda bisa mengatur di xaml? Saya menggunakan ini dan tidak berhasil <Style.Triggers> <Trigger Property = "Validation.HasError" Value = "True"> <Setter Property = "FocusManager.FocusedElement" Value = "{Binding Source = {RelativeSource Self}}" /> </Trigger> </Style.Triggers>
WPFKK

@ user841612, periksa link berikut dan verifikasi Majelis dan Namespace msdn.microsoft.com/en-us/library/…
bergunaBee

Ini hanya bekerja sekali. Jika Anda ingin mengubah fokus setelah halaman dibuat, Anda perlu melakukannya secara terprogram.
Joe Steele

ini juga berhasil. txtCompanyID.Focusable = true; Keyboard.Focus (txtCompanyID);
MindRoasterMir

51

Sejauh ini tidak ada yang menjelaskan mengapa kode dalam pertanyaan tersebut tidak berfungsi. Dugaan saya adalah bahwa kode tersebut ditempatkan di konstruktor Window. Namun saat ini masih terlalu dini untuk menetapkan fokus. Itu harus dilakukan setelah Jendela siap untuk interaksi. Tempat terbaik untuk kode adalah acara Loaded:

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

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

1
benar secara logis, setelah terlalu banyak perjuangan jawaban ini cukup bagus dan sempurna sebagai solusi.
shivani

ini berhasil untuk saya. jawaban yang diterima tidak. Terima kasih
BoundForGlory

tidak yakin apakah versi tertentu, tetapi Focus()memerlukan parameter status fokus - misalnyatxtCompanyId.Focus(FocusState.Keyboard)
Dan


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

msdn:

Hanya ada satu elemen di seluruh desktop yang memiliki fokus keyboard. Di WPF, elemen yang memiliki fokus keyboard akan membuat IsKeyboardFocused disetel ke true.

Anda dapat memutuskan setelah garis pengaturan dan memeriksa nilai IsKeyboardFocusedproperti. Juga periksa apakah Anda benar-benar mencapai garis itu atau mungkin Anda menyetel beberapa elemen lain untuk mendapatkan fokus setelah itu.


19

Coba ini : MyTextBox.Focus ( );


2
Ini adalah jawaban yang paling elegan dan tidak mengharuskan Anda menentukan induknya juga. Terima kasih untuk ini, ini sangat bagus untuk saya!
dbeachy1

Jawaban Peter Huber melakukan ini tetapi menjelaskan bahwa jendela harus dimuat terlebih dahulu, itulah sebabnya saya tidak berfungsi
Adriaan Davel

14

Tak satu pun dari ini berhasil untuk saya karena saya menggunakan kisi daripada StackPanel.

Saya akhirnya menemukan contoh ini: http://spin.atomicobject.com/2013/03/06/xaml-wpf-textbox-focus/

dan mengubahnya menjadi ini:

Di bagian 'Sumber Daya':

    <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>

Dalam definisi kisi saya:

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

2
Ini juga berhasil untuk saya. Sisanya tidak. Terima kasih untuk tautannya, itu cukup menarik. Juga menarik bahwa hal sederhana seperti itu bisa sangat rumit.
TravisWhidden

2
Jawaban di atas berfungsi dengan baik terlepas dari apakah wadahnya adalah Gird atau StackPanel. Karena struktur kisi Anda tidak jelas, sulit untuk mengatakan apa yang salah. Senang melihat alternatifnya.
BergunaBee

1
Bagi saya, ini juga satu-satunya yang berfungsi dengan benar. Cara yang bagus.
OregonGhost

7

Jika Anda belum menemukan solusi di jawaban lain, begitulah cara saya menyelesaikan masalah.

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

Dari apa yang saya pahami, solusi lain mungkin tidak berfungsi karena panggilan ke Focus()dipanggil sebelum aplikasi membuat komponen lain.


3
Jawaban ini layak mendapat peringkat yang lebih baik.
Simon Mourier

0

Solusi lain yang mungkin adalah dengan menggunakan FocusBehavior yang disediakan oleh Kerangka MVVM DevExpress gratis :

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

Ini memungkinkan Anda untuk memfokuskan kontrol saat dimuat, saat peristiwa tertentu dimunculkan atau properti diubah.


0

Dalam Kode belakang Anda dapat mencapainya hanya dengan melakukan ini.

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

Catatan: Ini tidak akan berfungsi sebelum jendela dimuat

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.