ตั้งโฟกัสบนกล่องข้อความใน WPF


105

วิธีตั้งโฟกัสบนไฟล์ TextBoxองค์ประกอบใน WPF

ฉันมีรหัสนี้:

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

... แต่มันไม่ทำงาน

ความคิดใด ๆ ?


txtCompanyID.Focusable = จริง; Keyboard.Focus (txtCompanyID); มันใช้งานได้ แต่นี่คือวิธีการ
MindRoasterMir

คำตอบ:


146

ใน XAML:

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

9
ฉันชอบแนวทางนี้มากกว่าวิธีอื่น ๆ ข้างต้นเนื่องจากสอดคล้องกับ MVVM
Todd Sprang

1
องค์ประกอบที่โฟกัสถูกอ่านอย่างเดียวถูกต้องคุณจะตั้งค่าใน xaml ได้อย่างไร? ฉันใช้สิ่งนี้และไม่ได้ผล <Style.Triggers> <Trigger Property = "Validation.HasError" Value = "True"> <Setter Property = "FocusManager.FocusedElement" Value = "{Binding Source = {RelativeSource Self}}" /> </Trigger> </Style.Triggers>
WPFKK

@ user841612 ตรวจสอบลิงค์ต่อไปนี้และตรวจสอบ Assembly และ Namespace msdn.microsoft.com/en-us/library/…
ประโยชน์

ใช้งานได้เพียงครั้งเดียว หากคุณต้องการเปลี่ยนโฟกัสหลังจากสร้างเพจแล้วคุณต้องดำเนินการโดยใช้โปรแกรม
Joe Steele

มันก็ใช้ได้เช่นกัน txtCompanyID.Focusable = จริง; Keyboard.Focus (txtCompanyID);
MindRoasterMir

51

ยังไม่มีใครอธิบายได้ว่าทำไมโค้ดในคำถามถึงใช้ไม่ได้ ฉันเดาว่ารหัสถูกวางไว้ในตัวสร้างของหน้าต่าง แต่ในเวลานี้ยังเร็วเกินไปที่จะกำหนดโฟกัส จะต้องทำเมื่อหน้าต่างพร้อมสำหรับการโต้ตอบ ตำแหน่งที่ดีที่สุดสำหรับโค้ดคือเหตุการณ์ Loaded:

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

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

1
เป็นจริงตามเหตุผลหลังจากต่อสู้มากเกินไปคำตอบนี้ค่อนข้างดีและสมบูรณ์แบบสำหรับการแก้ปัญหา
shivani

สิ่งนี้ได้ผลสำหรับฉัน คำตอบที่ยอมรับไม่ได้ ขอบคุณ
BoundForGlory

ไม่แน่ใจว่าเฉพาะเวอร์ชันหรือไม่ แต่Focus()ต้องใช้พารามิเตอร์สถานะโฟกัสเช่นtxtCompanyId.Focus(FocusState.Keyboard)
Dan


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

msdn:

สามารถมีองค์ประกอบเดียวบนเดสก์ท็อปทั้งหมดที่มีแป้นพิมพ์โฟกัส ใน WPF องค์ประกอบที่มีแป้นพิมพ์โฟกัสจะมี IsKeyboardFocused ตั้งค่าเป็น true

คุณสามารถทำลายหลังจากบรรทัดการตั้งค่าและตรวจสอบมูลค่าของIsKeyboardFocusedทรัพย์สิน ตรวจสอบด้วยว่าคุณไปถึงเส้นนั้นจริงๆหรือบางทีคุณอาจตั้งค่าองค์ประกอบอื่น ๆ เพื่อให้ได้โฟกัสหลังจากนั้น


19

ลองสิ่งนี้: MyTextBox.Focus ( );


2
นี่เป็นคำตอบที่สวยหรูที่สุดและคุณไม่จำเป็นต้องระบุผู้ปกครองด้วย ขอบคุณสำหรับสิ่งนี้มันใช้งานได้ดีสำหรับฉัน!
dbeachy1

คำตอบของ Peter Huber ทำสิ่งนี้ แต่อธิบายว่าต้องโหลดหน้าต่างก่อนซึ่งเป็นสาเหตุที่ทำให้ของฉันไม่ทำงาน
Adriaan Davel

14

สิ่งนี้ไม่ได้ผลสำหรับฉันเพราะฉันใช้กริดแทนที่จะเป็น 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}" />

3
สิ่งนี้ใช้ได้ผลกับฉันด้วย ส่วนที่เหลือไม่ได้ ขอบคุณสำหรับลิงค์ที่น่าสนใจทีเดียว น่าสนใจเช่นกันที่สิ่งง่ายๆเช่นนี้อาจซับซ้อนได้
TravisWhidden

2
คำตอบข้างต้นใช้ได้ดีไม่ว่าคอนเทนเนอร์นั้นจะเป็น Gird หรือ StackPanel ก็ตาม เนื่องจากโครงสร้างของกริดของคุณไม่ชัดเจนจึงยากที่จะบอกได้ว่ามีอะไรผิดพลาดเกิดขึ้น ยินดีที่ได้เห็นทางเลือกอื่น ๆ
ประโยชน์Bee

1
สำหรับฉันนี่เป็นเพียงคนเดียวที่ทำงานได้อย่างถูกต้อง วิธีที่ดี
OregonGhost

7

ในกรณีที่คุณไม่พบวิธีแก้ปัญหาสำหรับคำตอบอื่น ๆ นั่นคือวิธีที่ฉันแก้ไขปัญหา

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

จากสิ่งที่ฉันเข้าใจวิธีแก้ปัญหาอื่น ๆ อาจไม่ได้ผลเนื่องจากมีการเรียกFocus()ใช้ก่อนที่แอปพลิเคชันจะแสดงผลส่วนประกอบอื่น ๆ


3
คำตอบนี้สมควรได้รับอันดับที่ดีกว่า
Simon Mourier

0

อีกวิธีหนึ่งที่เป็นไปได้คือการใช้FocusBehaviorจากDevExpress MVVM Framework ฟรี :

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

ช่วยให้คุณสามารถโฟกัสตัวควบคุมเมื่อโหลดเมื่อเหตุการณ์บางอย่างถูกยกขึ้นหรือคุณสมบัติมีการเปลี่ยนแปลง


0

ใน Code ที่อยู่เบื้องหลังคุณสามารถทำได้โดยการทำสิ่งนี้เท่านั้น

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

หมายเหตุ: จะไม่ทำงานก่อนที่จะโหลดหน้าต่าง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.