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


91

แม้จะมีบางโพสต์ในฟอรัมนี้และอื่น ๆ ฉันไม่พบบางสิ่งที่บอกวิธีตั้งค่าโฟกัสที่ไฟล์TextBox.

ฉันมี UserControl ที่มีป้ายกำกับและกล่องข้อความมากมาย เมื่อโหลดแบบฟอร์มฉันต้องการให้กล่องข้อความเฉพาะมีโฟกัส

ฉันได้ตั้งค่า tabIndex แล้ว แต่ดูเหมือนจะไม่ได้ผล

ข้อเสนอแนะใด ๆ ?


คำตอบ:


177

คุณสามารถใช้FocusManager.FocusedElementคุณสมบัติที่แนบมาเพื่อวัตถุประสงค์นี้ นี่คือโค้ดส่วนหนึ่งที่กำหนดโฟกัสเป็น TxtB ตามค่าเริ่มต้น

<StackPanel Orientation="Vertical" FocusManager.FocusedElement="{Binding ElementName=TxtB}">
    <TextBox x:Name="TxtA" Text="A" />
    <TextBox x:Name="TxtB" Text="B" />
</StackPanel>

คุณยังสามารถใช้TxtB.Focus()ใน code-behind หากคุณไม่ต้องการทำใน XAML


13
@TarkaDaal: ความคิดเห็น "มันใช้ไม่ได้สำหรับฉัน" อาจอธิบายได้ละเอียดกว่านี้เล็กน้อย อาจเป็นอีกการควบคุมที่ขโมยโฟกัส เมื่อสงครามโฟกัสเริ่มต้นใน WPF สิ่งต่างๆมักจะซน! โปรดตรวจสอบการควบคุมของคุณและตำแหน่งที่คุณอยู่ในแผนผังภาพ (ตัวอย่างเช่นในเทมเพลต ComboBox สิ่งนี้จะไม่มีผลและมีกรณีอื่น ๆ เช่นนี้อีกมากมาย) หากคุณไม่พบตัวขโมยให้ใช้พฤติกรรมหรือรหัสหลังเพื่อตั้งโฟกัสไปที่ตัวควบคุมเมื่อโหลดแล้ว
Julien Lebosquain

@JulienLebosquain: มันเป็นการควบคุมที่ค่อนข้างง่ายปุ่มสองปุ่มและกล่องข้อความภายในตาราง (ซึ่งเป็นที่ที่ฉันใส่ของไว้FocusManager) ในท้ายที่สุดฉันก็ทำตามรหัสหลัง
TarkaDaal

สมาชิก "FocusedElement" ไม่รู้จักหรือไม่สามารถเข้าถึงได้ :( plus.google.com/photos/+HendyIrawan/albums/5990385944888867505/…
Hendy Irawan

@HendyIrawan นั่นคือโครงการ Silverlight หรือเปล่า?
MojoFilter

@MojoFilter เป็นโครงการ Windows Phone 8 WPF
Hendy Irawan

26

คุณสามารถใช้คุณสมบัตินี้ได้โดยตรงบนกล่องข้อความ:

<TextBox Text="{Binding MyText}" FocusManager.FocusedElement="{Binding RelativeSource={RelativeSource Self}}"/>

17
ไม่ได้ผลสำหรับฉันการตั้งค่า FocusManager.FocusedElement = "{Binding ElementName = TxtB}" บนคอนเทนเนอร์ใช้งานได้
สิทธิ์ใน

1
ทำงานได้อย่างมีเสน่ห์และไม่ต้องการการตั้งชื่อใด ๆ
Simon Mattes

1
ไม่ได้ผลสำหรับฉันเช่นกัน เราขาดอะไรไปหรือเปล่า?
BrunoLM

1
ไม่ได้ผลสำหรับฉันเช่นกัน ข้อเสนอแนะโดย Julien Lebosquain ทำงาน
Crypt32

1
ไม่ได้ผลสำหรับฉันเช่นกัน วิธีอื่น ๆ ทั้งหมดที่เสนอก็ไม่ได้ผลเช่นกัน ปัญหานี้ต้องเป็นปัญหาเบื้องต้นและควรแก้ไขได้อย่างสบาย ๆ .. นั่นคือเหตุผลที่หลาย ๆ คนไม่ชอบ wpf
IgorStack

6

ฉันยังใหม่กับการใช้ WPF และอ่านตัวอย่างข้างต้นฉันมีประสบการณ์คล้าย ๆ กันในการพยายามกำหนดโฟกัสไปที่กล่องข้อความโดยใช้ตัวอย่างโค้ด xaml ที่ให้ไว้นั่นคือตัวอย่างทั้งหมดข้างต้นไม่ได้ผล

สิ่งที่ฉันพบคือฉันต้องวาง FocusManager.FocusElement ในองค์ประกอบของหน้า ฉันคิดว่าสิ่งนี้อาจใช้งานได้เช่นกันถ้าคุณใช้ Window เป็นองค์ประกอบหลัก อย่างไรก็ตามนี่คือรหัสที่ใช้ได้กับฉัน

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

0

ผูกองค์ประกอบที่คุณต้องการชี้โฟกัสเป็น

FocusManager.FocusedElement= "{Binding ElementName= Comobox1}"

ในกริดหรือ groupbox เป็นต้น


4
อืมขอบคุณที่ให้คำตอบแบบเดียวกันกับที่ทุกคนทำ ... 4 ปีต่อมา ...
Adam Plocher

4
@AdamPlocher ดีมากคุณทำให้ Sulfian ปิด Stack Overflow อย่างถาวร ข้อความ "ยินดีต้อนรับสู่ Stack overflow" น่าจะเหมาะสมกว่า
Contango

2
@Contango: "ออนไลน์ล่าสุดNov 11 '14". เขาหายไปนานก่อนที่อดัมจะโพสต์ความคิดเห็นของเขา :)
Gone Coding

0

FocusManager ไม่ได้อยู่ใน Intellisense และสิ่งนี้ทำให้ฉันสับสนเล็กน้อย ฉันพิมพ์แอตทริบิวต์ทั้งหมดและใช้งานได้

FocusManager.FocusedElement = "{Binding ElementName = MyTextBox}"


Microsoft Visual Studio Enterprise 2015 เวอร์ชัน 14.0.23107.0/C#/WPF


0

เพื่อความสมบูรณ์นอกจากนี้ยังมีวิธีจัดการสิ่งนี้จากโค้ดด้านหลัง (เช่นในกรณีของการควบคุมที่สร้างแบบไดนามิกไม่ว่าด้วยเหตุผลใดก็ตามและไม่มีอยู่ใน XAML) แนบตัวจัดการกับเหตุการณ์ Loaded ของหน้าต่างจากนั้นใช้เมธอด ".Focus ()" ของตัวควบคุมที่คุณต้องการ ตัวอย่างกระดูกเปลือยด้านล่าง

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();
    }
}

0

จากการทดลองรอบ ๆ สารละลาย xaml

FocusManager.FocusedElement="{Binding ElementName=yourElement}"

ดูเหมือนจะทำงานได้ดีที่สุดเมื่อคุณวางไว้ในองค์ประกอบที่สูงที่สุดในลำดับชั้นของหน้าต่าง (โดยปกติจะเป็นหน้าต่างหรือตารางที่คุณวางทุกอย่างไว้)


0

การใช้งาน: 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);
    }

0

ฉันมีกล่องข้อความอยู่ในตารางภายใน DataTemplate ซึ่งฉันต้องการให้แป้นพิมพ์โฟกัสเมื่อมองเห็นได้ ฉันยังพบว่า

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

ไม่ได้ผลสำหรับฉัน

อย่างไรก็ตามเมื่อฉันเรียก Focus () ใน ContentControl หลัก

private void ContentControl_IsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e)
{
    if ((sender as ContentControl).IsVisible)
    {
        (sender as ContentControl).Focus();
    }
}

มันเริ่มทำงานและเครื่องหมายรูปหมวกจะปรากฏในกล่องข้อความ ฉันคิดว่า FocusScope ต้องได้รับการโฟกัสสำหรับคุณสมบัติ FocusManager.FocusedElement จึงจะมีผลใด ๆ

เจอร์รี่

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