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?

priyanka.sarkar
sumber
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>
berguna
sumber
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();
  }
}
Peter Huber
sumber
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
49

coba FocusManager.SetFocusedElement

FocusManager.SetFocusedElement(parentElement, txtCompanyID)
Arsen Mkrtchyan
sumber
5
Bagaimana jika elemen yang ingin Anda setel fokusnya adalah elemen induk oO?
Brock Hensley
10
FocusManager.SetFocusedElement (FocusManager.GetFocusScope (parentElement), parentElement);
Philter
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.

Svetlozar Angelov
sumber
19

Coba ini : MyTextBox.Focus ( );

NazOok
sumber
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}" />
Anya Harapan
sumber
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.

anemomylos
sumber
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.

Alex Russkov
sumber
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

MindRoasterMir
sumber