WPF และโฟกัสเริ่มต้น


191

ดูเหมือนว่าเมื่อแอปพลิเคชั่น WPF เริ่มต้นขึ้นจะไม่มีสิ่งใดโฟกัส

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

แอปจริงของฉันซับซ้อนกว่ากล่องข้อความ ฉันมี UserControls หลายชั้นภายใน UserControls หนึ่งใน UserControls นั้นมีตัวจัดการ Focusable = "True" และ KeyDown / KeyUp และฉันต้องการให้โฟกัสนั้นทันทีที่หน้าต่างเปิดขึ้น อย่างไรก็ตามฉันยังเป็นสามเณร WPF อยู่บ้างและฉันไม่มีโชคมากที่คิดวิธีการทำเช่นนี้

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

ฉันเล่นด้วย FocusManager.FocusedElement แต่ฉันไม่แน่ใจว่าตัวควบคุมใดที่จะตั้งไว้บน (หน้าต่างระดับบนสุด - พาเรนต์ที่มีตัวควบคุมที่โฟกัสได้หรือตัวควบคุมที่ปรับโฟกัสได้) หรือสิ่งที่จะตั้งค่า

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

คำตอบ:


165

วิธีนี้ใช้ได้ผลเช่นกัน:

<Window FocusManager.FocusedElement="{Binding ElementName=SomeElement}">

   <DataGrid x:Name="SomeElement">
     ...
   </DataGrid>
</Window>

4
ฉันประหลาดใจที่ฉันเป็นคนแรกที่แสดงความคิดเห็นเกี่ยวกับเรื่องนี้ ฉันสับสนว่าจะไปที่ไหนเพราะมันสามารถควบคุมได้เกือบทุกอย่าง ในการตอบคำถามเฉพาะนี้ผมคิดว่ามันจะไปในที่หน้าต่าง แต่คุณสามารถอ่านคำพูดในmsdn.microsoft.com/en-us/library/...จะเข้าใจวิธีการควบคุมที่คุณแนบนี้เรื่อง
Joel McBeth

ฉันได้ใช้วิธีนี้กับสแต็คพาเนลที่ประสบความสำเร็จ หากใครสนใจก็มีตัวอย่างอยู่ที่stackoverflow.com/a/2872306/378115
Julio Nobre

สิ่งนี้ได้ผลกับฉันดีกว่าคำตอบที่ยอมรับเพราะฉันต้องให้ความสำคัญกับองค์ประกอบที่เป็นครั้งแรก
Puterdo Borato

163

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

Loaded += (sender, e) =>
    MoveFocus(new TraversalRequest(FocusNavigationDirection.First));

การดำเนินการนี้จะเลือกตัวควบคุมแรกในลำดับแท็บโดยอัตโนมัติดังนั้นจึงเป็นโซลูชันทั่วไปที่ควรวางลงในหน้าต่างใดก็ได้และ Just Work


21
เพิ่มเทิร์นนั้นเป็นพฤติกรรม <Window FocusBehavior.FocusFirst = "true"> ... </Window>
wekempf

6
@wekempf ฉันไม่คุ้นเคยกับความคิดเกี่ยวกับพฤติกรรม แต่ฉันมองเข้าไปในนั้นและนั่นไม่ใช่ความคิดที่ไม่ดีเลย หากคนอื่น (เช่นฉัน) ไม่คุ้นเคยกับพฤติกรรมที่แนบมาแล้วนี่เป็นคำอธิบาย: codeproject.com/KB/WPF/AttachedBehaviors.aspx
Joe White

1
นอกจากนี้จะใช้งานได้หากองค์ประกอบที่ต้องการคือ UserControl ซึ่งมีองค์ประกอบที่สามารถโฟกัสได้จริง (แม้ในลำดับชั้นลึก) ที่ดี!
Daniel Albuschat

1
ความคิดที่ดี Buttonแต่บางครั้งก็ไม่ทำงานถ้าควบคุมที่จะยอมรับโฟกัสเป็น ในการแก้ไขปัญหานี้ฉันพลิกการMoveFocusโทรผ่านโปรแกรมเลือกจ่ายงานที่มีContextIdleความสำคัญ ( Backgroundหรือสูงกว่าใช้งานไม่ได้) นอกจากนี้ยังมีสิ่งFocusNavigationDirection.Firstที่ตรงกับเจตนาดีกว่าและทำสิ่งเดียวกันในกรณีนี้
Anton Tykhyy

นั่นควรเป็นพฤติกรรมเริ่มต้น! Yuck (ในโพสต์ต้นฉบับ) ถูกต้อง!
นิวแฮมป์เชียร์

61

ตามคำตอบที่ยอมรับซึ่งนำไปใช้เป็นพฤติกรรมที่แนบมา:

using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;

namespace UI.Behaviors
{
    public static class FocusBehavior
    {
        public static readonly DependencyProperty FocusFirstProperty =
            DependencyProperty.RegisterAttached(
                "FocusFirst",
                typeof(bool),
                typeof(FocusBehavior),
                new PropertyMetadata(false, OnFocusFirstPropertyChanged));

        public static bool GetFocusFirst(Control control)
        {
            return (bool)control.GetValue(FocusFirstProperty);
        }

        public static void SetFocusFirst (Control control, bool value)
        {
            control.SetValue(FocusFirstProperty, value);
        }

        static void OnFocusFirstPropertyChanged(
            DependencyObject obj, DependencyPropertyChangedEventArgs args)
        {
            Control control = obj as Control;
            if (control == null || !(args.NewValue is bool))
            {
                return;
            }

            if ((bool)args.NewValue)
            {
                control.Loaded += (sender, e) =>
                    control.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
            }
        }
    }
}

ใช้แบบนี้:

<Window xmlns:Behaviors="clr-namespace:UI.Behaviors"
        Behaviors:FocusBehavior.FocusFirst="true">

6
ในความคิดของฉันนี้เป็นไกลโดยทางออกที่ดีที่สุดที่ฉันได้พบ ขอบคุณ!
Shion

1
DependencyProperty.RegisterAttachedมีข้อผิดพลาดในรหัสในคำตอบนี้ในการเรียกร้องให้เป็น พารามิเตอร์ที่สามควรจะเป็นไม่ได้typeof(FocusBehavior) typeof(Control)การเปลี่ยนแปลงนี้จะป้องกันไม่ให้ผู้ออกแบบรายงานคุณสมบัติ 'FocusFirst' ที่ลงทะเบียนไว้แล้วโดยข้อผิดพลาด 'การควบคุม'
โทนี่ Vitabile

@TonyVitabile แก้ไขแล้ว คุณสามารถแก้ไขและปรับปรุงคำตอบได้ตลอดเวลา :)
Mizipzor

ไม่ควรควบคุมจัดการตัวจัดการเหตุการณ์ที่โหลดหายไปในระหว่างการโหลด
andreapier

@ andreapier คุณทำได้ถ้าคุณแคร์ แต่การปิดการลงทะเบียนจะไม่ทำให้หน่วยความจำรั่วหรืออะไรก็ตาม คุณเพียงแค่ต้องกังวลเกี่ยวกับเหตุการณ์ที่ทำให้เกิดการรั่วไหลของหน่วยความจำหากวัตถุระยะสั้นมีวิธีการที่แนบมากับเหตุการณ์บนวัตถุที่มีอายุการใช้งานยาวนาน ในกรณีนี้อายุการใช้งานเป็นเท่าของหน้าต่างดังนั้นคุณก็สบายดี
Joe White

14

ฉันพบวิธีแก้ปัญหาอื่นที่เป็นไปได้ Mark Smith โพสต์ส่วนขยายมาร์กอัพ FirstFocusedElementสำหรับใช้กับ FocusManager.FocusedElement

<UserControl x:Class="FocusTest.Page2"
    xmlns:FocusTest="clr-namespace:FocusTest"
    FocusManager.FocusedElement="{FocusTest:FirstFocusedElement}">

เนียนอย่างเต็มที่! ขอบคุณ!
Andy

9

มีปัญหาเดียวกันแก้ไขด้วยวิธีแก้ปัญหาง่าย ๆ : ในหน้าต่างหลัก:

  <Window ....
        FocusManager.FocusedElement="{Binding ElementName=usercontrolelementname}"
         ... />

ในการควบคุมผู้ใช้:

private void UserControl_GotFocus_1(object sender, RoutedEventArgs e)
        {
            targetcontrol.Focus();
            this.GotFocus -= UserControl_GotFocus_1;  // to set focus only once
        }

3
ใช้ได้เฉพาะในกรณีที่การควบคุมอยู่ภายในหน้าต่างโดยตรงเท่านั้นหากไม่ใช่การควบคุมภายใน UserControl
Joe White

8

หลังจากมี 'WPF Initial Focus Nightmare' และตามคำตอบบางอย่างเกี่ยวกับสแต็คต่อไปนี้พิสูจน์ให้ฉันเห็นว่าเป็นทางออกที่ดีที่สุด

ก่อนอื่นให้เพิ่ม App.xaml OnStartup () ดังนี้:

EventManager.RegisterClassHandler(typeof(Window), Window.LoadedEvent,
          new RoutedEventHandler(WindowLoaded));

จากนั้นเพิ่มเหตุการณ์ 'WindowLoaded' ใน App.xaml ด้วย:

void WindowLoaded(object sender, RoutedEventArgs e)
    {
        var window = e.Source as Window;
        System.Threading.Thread.Sleep(100);
        window.Dispatcher.Invoke(
        new Action(() =>
        {
            window.MoveFocus(new TraversalRequest(FocusNavigationDirection.First));

        }));
    }

ปัญหาเธรดต้องใช้เป็น WPF โฟกัสเริ่มต้นส่วนใหญ่ล้มเหลวเนื่องจากเงื่อนไขการแข่งขันกรอบ

ฉันพบวิธีแก้ไขปัญหาต่อไปนี้ที่ดีที่สุดเนื่องจากใช้ทั่วโลกสำหรับแอปทั้งหมด

หวังว่ามันจะช่วย ...

โอฬาร


5
ใช้BeginInvokeแทนSleep(100)คำแถลงที่น่ากลัว
l33t

8

คุณสามารถตั้งค่าการควบคุมเป็นองค์ประกอบที่เน้นใน XAML ได้อย่างง่ายดาย

<Window>
   <DataGrid FocusManager.FocusedElement="{Binding RelativeSource={RelativeSource Self}}">
     ...
   </DataGrid>
</Window>

ฉันไม่เคยลองตั้งค่านี้ในการควบคุมของผู้ใช้และดูว่าการทำงานนี้ แต่มันอาจ


มันฟังดูน่าสนใจเพราะคุณไม่ได้ตั้งชื่อตัวควบคุมสำหรับปัญหาโฟกัส ในทางกลับกันการทดสอบของฉันกับการควบคุมผู้ใช้ไม่ทำงาน
heringer

นั่นไม่ได้ทำให้ฉันประหลาดใจ @heringer ... ที่จะพยายามตั้งสมาธิให้กับ <border> หรือการควบคุมที่ไม่ต้องมีการโต้ตอบ คุณสามารถลองใช้แอททริบิวต์ FocusedElement นี้บนตัวควบคุมเชิงโต้ตอบภายใน usercontrol แต่นั่นอาจไม่ใช่ตัวเลือก
Simon Gillbee

ฉันใช้วิธีนี้กับ stackpanel เพื่อตั้งค่าปุ่มลูกที่ฉันต้องการโฟกัสเมื่อมีการโหลดแบบฟอร์ม ขอบคุณมาก
Julio Nobre

ระวังมันอาจจะทำให้การผูกเสียอย่างสมบูรณ์ stackoverflow.com/questions/30676863/…
Der_Meister

2

คำตอบเล็ก ๆ น้อย ๆ ของMizipzorสำหรับ C # 6+

public static class FocusBehavior
{
    public static readonly DependencyProperty GiveInitialFocusProperty =
        DependencyProperty.RegisterAttached(
            "GiveInitialFocus",
            typeof(bool),
            typeof(FocusBehavior),
            new PropertyMetadata(false, OnFocusFirstPropertyChanged));

    public static bool GetGiveInitialFocus(Control control) => (bool)control.GetValue(GiveInitialFocusProperty);
    public static void SetGiveInitialFocus(Control control, bool value) => control.SetValue(GiveInitialFocusProperty, value);

    private static void OnFocusFirstPropertyChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args)
    {
        var control = obj as Control;

        if (control == null || !(args.NewValue is bool))
            return;

        if ((bool)args.NewValue)
            control.Loaded += OnControlLoaded;
        else
            control.Loaded -= OnControlLoaded;
    }

    private static void OnControlLoaded(object sender, RoutedEventArgs e) => ((Control)sender).MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
}

ใช้ใน XAML ของคุณ:

<Window local:FocusBehavior.GiveInitialFocus="True" />

1

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

1 - สังเกตองค์ประกอบที่ได้รับโฟกัส (ไม่ว่ามันจะเป็นอะไร!)

2 - เพิ่มในรหัสของคุณหลัง xxx.xaml.cs

private bool _firstLoad;

3 - เพิ่มสิ่งนี้ลงบนองค์ประกอบที่ได้รับโฟกัสแรก:

GotFocus="Element_GotFocus"

4 - เพิ่มเมธอด Element_GotFocus ในโค้ดด้านหลังและระบุองค์ประกอบชื่อ WPF ที่ต้องการโฟกัสแรก:

private void Element_GotFocus(object sender, RoutedEventArgs e)
{
    if(_firstLoad)
    {
        this.MyElementWithFistFocus.Focus();
        _firstLoad = false;
    }
}

5 - จัดการเหตุการณ์ที่โหลด

ใน XAML

Loaded="MyWindow_Loaded"   

ใน xaml.cs

private void MyWindow_Loaded(object sender, RoutedEventArgs e)
{
        _firstLoad = true;
        this.Element_GotFocus(null, null);
}

หวังว่านี่จะช่วยเป็นทางออกสุดท้าย


0

ฉันยังประสบปัญหาเดียวกัน ฉันมีกล่องข้อความสามกล่องในคอนเทนเนอร์ผ้าใบและต้องการให้กล่องข้อความแรกเน้นเมื่อผู้ใช้เปิดขึ้น รหัส WPF ตามรูปแบบ MVVM ฉันสร้างคลาสพฤติกรรมแยกต่างหากเพื่อมุ่งเน้นองค์ประกอบและผูกเข้ากับมุมมองของฉันเช่นนี้

รหัสพฤติกรรมผ้าใบ

public  class CanvasLoadedBehavior : Behavior<Canvas>
{
    private Canvas _canvas;
    protected override void OnAttached()
    {
        base.OnAttached();
        _canvas = AssociatedObject as Canvas;
        if (_canvas.Name == "ReturnRefundCanvas")
        {

            _canvas.Loaded += _canvas_Loaded;
        }


    }

    void _canvas_Loaded(object sender, RoutedEventArgs e)
    {
        FocusNavigationDirection focusDirection = FocusNavigationDirection.Next;

        // MoveFocus takes a TraveralReqest as its argument.
        TraversalRequest request = new TraversalRequest(focusDirection);
        UIElement elementWithFocus = Keyboard.FocusedElement as UIElement;
        if (elementWithFocus != null)
        {
            elementWithFocus.MoveFocus(request);
        }

    }

}

รหัสสำหรับการดู

<Canvas  Name="ReturnRefundCanvas" Height="200" Width="1466" DataContext="{Binding RefundSearchViewModel}">
                <i:Interaction.Behaviors>
                    <b:CanvasLoadedBehavior />
                </i:Interaction.Behaviors>
                <uc:Keyboard Canvas.Left="973" Canvas.Top="111" ToolTip="Keyboard" RenderTransformOrigin="-2.795,9.787"></uc:Keyboard>
                <Label  Style="{StaticResource Devlbl}" Canvas.Left="28" Content="Return and Refund Search" Canvas.Top="10" />
                <Image Height="30" Width="28" Canvas.Top="6" Canvas.Left="5" Source="pack://application:,,,/HomaKiosk;component/images/searchF.png">
                    <Image.OpacityMask>
                        <ImageBrush ImageSource="pack://application:,,,/HomaKiosk;component/images/searchF.png"/>
                    </Image.OpacityMask>
                </Image>

                <Separator Height="4" Canvas.Left="6" Margin="0" Canvas.Top="35" Width="1007"/>

                <ContentControl Canvas.Top="45" Canvas.Left="21"
                    ContentTemplate="{StaticResource ErrorMsg}"
                    Visibility="{Binding Error, Converter={c:StringNullOrEmptyToVisibilityConverter}}" 
                    Content="{Binding Error}" Width="992"></ContentControl>

                <Label  Style="{StaticResource Devlbl}" Canvas.Left="29" Name="FirstName" Content="First Name" Canvas.Top="90" />
                <wpf:AutoCompleteTextBox  Style="{StaticResource AutoComp}" Height="32" Canvas.Left="33" ToolTip="First Name"  Canvas.Top="120" Width="205"                     Padding="10,5" TabIndex="1001"
                    VerticalAlignment="Top"

                    Watermark=""
                    IconPlacement="Left"
                    IconVisibility="Visible"
                    Delay="100"

                    Text="{Binding FirstName, Mode=TwoWay, TargetNullValue=''}" 
                    Provider="{Binding FirstNameSuggestions}">
                    <wpf:AutoCompleteTextBox.ItemTemplate>
                        <DataTemplate>
                            <Border Padding="5">
                                <StackPanel Orientation="Vertical">
                                    <TextBlock Text="{Binding}"
                   FontWeight="Bold" />
                                </StackPanel>
                            </Border>
                        </DataTemplate>
                    </wpf:AutoCompleteTextBox.ItemTemplate>
                </wpf:AutoCompleteTextBox>

                <Label Style="{StaticResource Devlbl}" Canvas.Left="250" Content="Last Name" Canvas.Top="90" />
                <wpf:AutoCompleteTextBox  Style="{StaticResource AutoComp}" Height="32" ToolTip="Last Name" Canvas.Left="250"  Canvas.Top="120" Width="205" Padding="10,5"  TabIndex="1002"
                    VerticalAlignment="Top"
                    Watermark=""
                    IconPlacement="Left"
                    IconVisibility="Visible"
                    Delay="100"
                   Text="{Binding LastName, Mode=TwoWay, TargetNullValue=''}" 
                    Provider="{Binding LastNameSuggestions}">
                    <wpf:AutoCompleteTextBox.ItemTemplate>
                        <DataTemplate>
                            <Border Padding="5">
                                <StackPanel Orientation="Vertical">
                                    <TextBlock Text="{Binding}"
                   FontWeight="Bold" />
                                </StackPanel>
                            </Border>
                        </DataTemplate>
                    </wpf:AutoCompleteTextBox.ItemTemplate>
                </wpf:AutoCompleteTextBox>

                <Label Style="{StaticResource Devlbl}" Canvas.Left="480" Content="Receipt No" Canvas.Top="90" />
                             <wpf:AutoCompleteTextBox  Style="{StaticResource AutoComp}" Height="32" ToolTip="Receipt No" Canvas.Left="480"  Canvas.Top="120" Width="205" Padding="10,5"  TabIndex="1002"
                    VerticalAlignment="Top"
                    Watermark=""
                    IconPlacement="Left"
                    IconVisibility="Visible"
                    Delay="100"
                    Text="{Binding ReceiptNo, Mode=TwoWay, TargetNullValue=''}" 
                    Provider="{Binding ReceiptIdSuggestions}">
                    <wpf:AutoCompleteTextBox.ItemTemplate>
                        <DataTemplate>
                            <Border Padding="5">
                                <StackPanel Orientation="Vertical" >
                                    <TextBlock Text="{Binding}"
                   FontWeight="Bold">

                                    </TextBlock>
                                </StackPanel>
                            </Border>
                        </DataTemplate>
                    </wpf:AutoCompleteTextBox.ItemTemplate>
                    <i:Interaction.Behaviors>
                        <b:AllowableCharactersTextBoxBehavior RegularExpression="^[0-9]+$" MaxLength="15" />
                    </i:Interaction.Behaviors>
                </wpf:AutoCompleteTextBox>
                <!--<Label Style="{StaticResource Devlbl}" Canvas.Left="710" Content="Duration" Canvas.Top="79" />-->
                <!--<ComboBox AllowDrop="True" Canvas.Left="710" ToolTip="Duration" Canvas.Top="107" Width="205" TabIndex="1004"
                    Style="{StaticResource CommonComboBox}"      
                    ItemsSource="{Binding Durations}" DisplayMemberPath="Description" SelectedValuePath="Id" SelectedValue="{Binding SelectedDate, Mode=TwoWay}">

                </ComboBox>-->

                <Button Content="Search" Style="{StaticResource MyButton}" ToolTip="Search" 
                    Canvas.Top="116" Canvas.Left="710" Cursor="Hand" 
                    Command="{Binding SearchCommand}" TabIndex="2001">
                </Button>
                <Button Content="Clear" Style="{StaticResource MyButton}"  ToolTip="Clear"
                    Canvas.Top="116" Canvas.Left="840" Cursor="Hand" 
                    Command="{Binding ClearCommand}" TabIndex="2002">
                </Button>
                <Image Height="25" Width="25" Canvas.Top="175" Canvas.Left="25" Source="pack://application:,,,/HomaKiosk;component/images/chkpending.png"/>
                <Label  Style="{StaticResource LegendLbl}" Canvas.Left="50" Content="Check Returned and Payment Pending" Canvas.Top="178" />
                <Image Height="25" Width="25" Canvas.Top="175" Canvas.Left="300" Source="pack://application:,,,/HomaKiosk;component/images/chkrepaid.png"/>
                <Label  Style="{StaticResource LegendLbl}" Canvas.Left="325" Content="Repaid" Canvas.Top="178" />
                <Image Height="25" Width="25" Canvas.Top="175" Canvas.Left="395" Source="pack://application:,,,/HomaKiosk;component/images/refund.png"/>
                <Label  Style="{StaticResource LegendLbl}" Canvas.Left="415" Content="Refunded" Canvas.Top="178" />
                 </Canvas>

0

วิธีแก้ปัญหาข้างต้นไม่ทำงานตามที่คาดไว้สำหรับฉันฉันได้เปลี่ยนพฤติกรรมที่เสนอโดย Mizipzor เล็กน้อยดังต่อไปนี้:

จากส่วนนี้

if ((bool)args.NewValue)
        {
            control.Loaded += (sender, e) =>
                   control.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
        }

สำหรับสิ่งนี้

if ((bool)args.NewValue)
        {
            control.Loaded += (sender, e) => control.Focus();
        }

และฉันไม่ได้ติดพฤติกรรมนี้กับ Window หรือ UserControl แต่เพื่อควบคุมฉันต้องการที่จะมุ่งเน้นในขั้นต้นเช่น:

<TextBox ui:FocusBehavior.InitialFocus="True" />

โอ้ขออภัยสำหรับการตั้งชื่ออื่นฉันใช้ชื่อ InitialFocus สำหรับคุณสมบัติที่แนบมา

และนี่ใช้งานได้สำหรับฉันบางทีมันอาจช่วยคนอื่นได้


-1
<Window FocusManager.FocusedElement="{Binding ElementName=yourControlName}">

3
โปรดระบุบริบทเพิ่มเติมให้กับคำตอบของคุณ
Anirudh Ramanathan

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