วิธีตั้งโฟกัสบนไฟล์ TextBox
องค์ประกอบใน WPF
ฉันมีรหัสนี้:
txtCompanyID.Focusable = true;
txtCompanyID.Focus();
... แต่มันไม่ทำงาน
ความคิดใด ๆ ?
วิธีตั้งโฟกัสบนไฟล์ TextBox
องค์ประกอบใน WPF
ฉันมีรหัสนี้:
txtCompanyID.Focusable = true;
txtCompanyID.Focus();
... แต่มันไม่ทำงาน
ความคิดใด ๆ ?
คำตอบ:
ใน XAML:
<StackPanel FocusManager.FocusedElement="{Binding ElementName=Box}">
<TextBox Name="Box" />
</StackPanel>
ยังไม่มีใครอธิบายได้ว่าทำไมโค้ดในคำถามถึงใช้ไม่ได้ ฉันเดาว่ารหัสถูกวางไว้ในตัวสร้างของหน้าต่าง แต่ในเวลานี้ยังเร็วเกินไปที่จะกำหนดโฟกัส จะต้องทำเมื่อหน้าต่างพร้อมสำหรับการโต้ตอบ ตำแหน่งที่ดีที่สุดสำหรับโค้ดคือเหตุการณ์ Loaded:
public KonsoleWindow() {
public TestWindow() {
InitializeComponent();
Loaded += TestWindow_Loaded;
}
private void TestWindow_Loaded(object sender, RoutedEventArgs e) {
txtCompanyID.Focus();
}
}
Focus()
ต้องใช้พารามิเตอร์สถานะโฟกัสเช่นtxtCompanyId.Focus(FocusState.Keyboard)
ลองFocusManager.SetFocusedElement
FocusManager.SetFocusedElement(parentElement, txtCompanyID)
txtCompanyID.Focusable = true;
Keyboard.Focus(txtCompanyID);
msdn:
สามารถมีองค์ประกอบเดียวบนเดสก์ท็อปทั้งหมดที่มีแป้นพิมพ์โฟกัส ใน WPF องค์ประกอบที่มีแป้นพิมพ์โฟกัสจะมี IsKeyboardFocused ตั้งค่าเป็น true
คุณสามารถทำลายหลังจากบรรทัดการตั้งค่าและตรวจสอบมูลค่าของIsKeyboardFocused
ทรัพย์สิน ตรวจสอบด้วยว่าคุณไปถึงเส้นนั้นจริงๆหรือบางทีคุณอาจตั้งค่าองค์ประกอบอื่น ๆ เพื่อให้ได้โฟกัสหลังจากนั้น
ลองสิ่งนี้: MyTextBox.Focus ( );
สิ่งนี้ไม่ได้ผลสำหรับฉันเพราะฉันใช้กริดแทนที่จะเป็น StackPanel
ในที่สุดฉันก็พบตัวอย่างนี้: http://spin.atomicobject.com/2013/03/06/xaml-wpf-textbox-focus/
และแก้ไขเป็นสิ่งนี้:
ในส่วน "ทรัพยากร":
<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>
ในนิยามตารางของฉัน:
<Grid Style="{StaticResource FocusTextBox}" />
ในกรณีที่คุณไม่พบวิธีแก้ปัญหาสำหรับคำตอบอื่น ๆ นั่นคือวิธีที่ฉันแก้ไขปัญหา
Application.Current.Dispatcher.BeginInvoke(new Action(() =>
{
TEXTBOX_OBJECT.Focus();
}), System.Windows.Threading.DispatcherPriority.Render);
จากสิ่งที่ฉันเข้าใจวิธีแก้ปัญหาอื่น ๆ อาจไม่ได้ผลเนื่องจากมีการเรียกFocus()
ใช้ก่อนที่แอปพลิเคชันจะแสดงผลส่วนประกอบอื่น ๆ
อีกวิธีหนึ่งที่เป็นไปได้คือการใช้FocusBehaviorจากDevExpress MVVM Framework ฟรี :
<TextBox Text="This control is focused on startup">
<dxmvvm:Interaction.Behaviors>
<dxmvvm:FocusBehavior/>
</dxmvvm:Interaction.Behaviors>
</TextBox>
ช่วยให้คุณสามารถโฟกัสตัวควบคุมเมื่อโหลดเมื่อเหตุการณ์บางอย่างถูกยกขึ้นหรือคุณสมบัติมีการเปลี่ยนแปลง
ใน Code ที่อยู่เบื้องหลังคุณสามารถทำได้โดยการทำสิ่งนี้เท่านั้น
private void Window_Loaded(object sender, RoutedEventArgs e)
{
txtIndex.Focusable = true;
txtIndex.Focus();
}
หมายเหตุ: จะไม่ทำงานก่อนที่จะโหลดหน้าต่าง