Meskipun ada beberapa posting di forum ini dan yang lainnya, saya tidak dapat menemukan sesuatu yang memberitahu saya bagaimana mengatur fokus pada TextBox
.
Saya memiliki userControl dengan banyak label dan textBoxes. Saat formulir dimuat, saya ingin kotak teks tertentu memiliki fokus.
Saya telah mengatur tabIndex tetapi sepertinya tidak berhasil.
Ada saran?
Jawaban:
Anda dapat menggunakan
FocusManager.FocusedElement
properti terlampir untuk tujuan ini. Berikut adalah potongan kode yang mengatur fokus ke TxtB secara default.<StackPanel Orientation="Vertical" FocusManager.FocusedElement="{Binding ElementName=TxtB}"> <TextBox x:Name="TxtA" Text="A" /> <TextBox x:Name="TxtB" Text="B" /> </StackPanel>
Anda juga dapat menggunakan
TxtB.Focus()
di belakang kode Anda jika Anda tidak ingin melakukan ini di XAML.sumber
FocusManager
barang - barang itu). Pada akhirnya, saya melakukannya di belakang kode.Anda dapat menerapkan properti ini langsung di TextBox:
<TextBox Text="{Binding MyText}" FocusManager.FocusedElement="{Binding RelativeSource={RelativeSource Self}}"/>
sumber
Saya baru menggunakan WPF dan membaca contoh-contoh di atas. Saya memiliki pengalaman serupa mencoba mengatur fokus ke kotak teks menggunakan contoh kode xaml yang diberikan, yaitu semua contoh di atas tidak berfungsi.
Apa yang saya temukan adalah saya harus menempatkan FocusManager.FocusElement di elemen halaman. Saya berasumsi ini mungkin akan bekerja dengan baik jika Anda menggunakan Window sebagai elemen induk. Bagaimanapun, ini adalah kode yang berhasil untuk saya.
<Page x:Class="NameOfYourClass" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" mc:Ignorable="d" Title="Title" Height="720" Width="915" Background="white" Loaded="pgLoaded" FocusManager.FocusedElement="{Binding ElementName=NameOfYourTextBox}"> <!-- Create child elements here. --> </Page>
sumber
ikat elemen yang ingin Anda arahkan sebagai fokus
FocusManager.FocusedElement= "{Binding ElementName= Comobox1}"
di grid atau groupbox dll
sumber
Nov 11 '14
". Dia sudah lama pergi sebelum Adam memposting komentarnya :)FocusManager tidak masuk akal dan ini sedikit membingungkan saya. Saya baru saja mengetik seluruh atribut dan berhasil.
FocusManager.FocusedElement = "{Binding ElementName = MyTextBox}"
Microsoft Visual Studio Enterprise 2015 versi 14.0.23107.0/C#/WPF
sumber
Untuk kelengkapan, ada juga cara untuk menangani ini dari kode belakang (misalnya dalam kasus kontrol yang, untuk alasan apa pun, dibuat secara dinamis dan tidak ada di XAML). Lampirkan handler ke event Loaded jendela dan kemudian gunakan metode ".Focus ()" dari kontrol yang Anda inginkan. Contoh tulang telanjang di bawah ini.
public class MyWindow { private VisualCollection controls; private TextBox textBox; // constructor public MyWindow() { controls = new VisualCollection(this); textBox = new TextBox(); controls.Add(textBox); Loaded += window_Loaded; } private void window_Loaded(object sender, RoutedEventArgs e) { textBox.Focus(); } }
sumber
Dari bereksperimen berkeliling, solusi xaml
FocusManager.FocusedElement="{Binding ElementName=yourElement}"
tampaknya berfungsi paling baik saat Anda menempatkannya di elemen tertinggi dalam hierarki jendela (biasanya Jendela, atau Kotak tempat Anda meletakkan semua yang lain)
sumber
Pemakaian:
local:FocusManager.FocusOnLoad="True"
public class FocusManager { public static readonly DependencyProperty FocusOnLoad = DependencyProperty.RegisterAttached( "FocusOnLoad", typeof(bool), typeof(FocusManager), new UIPropertyMetadata(false, new PropertyChangedCallback(OnValueChanged)) ); private static void OnValueChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e) { if (!(sender is Control control)) return; if ((bool) e.NewValue == false) return; control.Loaded += (s, e) => control.Focus(); } public static bool GetFocusOnLoad(DependencyObject d) => (bool) d.GetValue(FocusOnLoad); public static void SetFocusOnLoad(DependencyObject d, bool value) => d.SetValue(FocusOnLoad, value); }
sumber
Saya memiliki TextBox di dalam Grid di dalam DataTemplate yang ingin saya fokuskan keyboard saat terlihat. Saya juga menemukan itu
<DataTemplate x:Key="DistanceView" DataType="{x:Type vm:ROI}"> <Grid FocusManager.FocusedElement="{Binding ElementName=tbDistance}"> <TextBox x:Name="tbDistance" Grid.Column="1" Grid.Row="1" VerticalAlignment="Bottom"/> </Grid> </DataTemplate>
tidak bekerja untuk saya.
Namun ketika saya memanggil Focus () di induk ContentControl
private void ContentControl_IsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e) { if ((sender as ContentControl).IsVisible) { (sender as ContentControl).Focus(); } }
itu mulai bekerja dan tanda sisipan terlihat di TextBox. Saya pikir FocusScope harus diberi fokus agar properti FocusManager.FocusedElement memiliki efek.
Jerry
sumber