Đặt tiêu điểm vào một hộp văn bản trong xaml wpf


91

Mặc dù một số bài đăng trên diễn đàn này và những bài khác, tôi không thể tìm thấy điều gì đó cho tôi biết cách đặt tiêu điểm vào TextBox .

Tôi có một userControl với nhiều nhãn và textBox. Khi biểu mẫu được tải, tôi muốn một textBox cụ thể có tiêu điểm.

Tôi đã đặt tabIndex nhưng điều đó dường như không hoạt động.

Bất kỳ đề xuất?


Bản sao có thể có của WPF và tiêu điểm ban đầu
Ruben Bartelink

Câu trả lời:


177

Bạn có thể sử dụng FocusManager.FocusedElementtài sản đính kèm cho mục đích này. Đây là một đoạn mã đặt tiêu điểm thành TxtB theo mặc định.

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

Bạn cũng có thể sử dụng TxtB.Focus()mã phía sau của mình nếu bạn không muốn làm điều này trong XAML.


13
@TarkaDaal: nhận xét "nó không hiệu quả với tôi" có thể được trau chuốt hơn một chút. Nó có thể là một điều khiển khác đánh cắp tiêu điểm. Khi cuộc chiến tập trung bắt đầu trong WPF, mọi thứ có xu hướng trở nên hư hỏng! Vui lòng xác minh các điều khiển của bạn và nơi bạn hiện đang ở trong cây trực quan (ví dụ: bên trong mẫu ComboBox, điều này sẽ không có tác dụng và có rất nhiều trường hợp khác như thế này). Nếu bạn không thể tìm thấy kẻ trộm, hãy sử dụng một hành vi hoặc mã phía sau để đặt tiêu điểm cho điều khiển khi nó được tải.
Julien Lebosquain

@JulienLebosquain: Đó là một điều khiển khá đơn giản, hai nút và một TextBox trong Grid (đó là nơi tôi đặt các FocusManagerthứ). Cuối cùng, tôi đã làm điều đó trong đoạn mã phía sau.
TarkaDaal

Thành viên "FocusedElement" không được công nhận hoặc không thể truy cập được. :( plus.google.com/photos/+HendyIrawan/albums/5990385944888867505/…
Hendy Irawan

@HendyIrawan Đó có phải là một dự án Silverlight không?
MojoFilter

@MojoFilter đó là một dự án Windows Phone 8 WPF
Hendy Irawan

28

Bạn có thể áp dụng thuộc tính này trực tiếp trên TextBox:

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

16
Không hiệu quả với tôi, việc đặt FocusManager.FocusedElement = "{Binding ElementName = TxtB}" trên vùng chứa đã hoạt động
Grant

1
Hoạt động như một sự quyến rũ và không yêu cầu bất kỳ tên gọi nào.
Simon Mattes

1
Không làm việc cho tôi là tốt. Chúng ta đang thiếu một cái gì đó?
BrunoLM

1
Cũng không hiệu quả với tôi. Đề xuất của Julien Lebosquain tác phẩm.
Crypt32

1
Nó cũng không hiệu quả với tôi. Tất cả các phương pháp khác được đề xuất cũng không hoạt động. Vấn đề này phải là cơ bản và nên được giải quyết một cách dễ dàng .. Đó là lý do tại sao nhiều ppl không thích wpf.
IgorStack

6

Tôi mới sử dụng WPF và đọc qua các ví dụ trên, tôi đã có trải nghiệm tương tự khi thử đặt tiêu điểm vào hộp văn bản bằng cách sử dụng các ví dụ mã xaml đã cho, tức là tất cả các ví dụ ở trên đều không hoạt động.

Những gì tôi tìm thấy là tôi phải đặt FocusManager.FocusElement trong phần tử trang. Tôi cho rằng điều này có thể cũng sẽ hoạt động nếu bạn sử dụng Window làm phần tử mẹ. Dù sao, đây là mã đã làm việc cho tôi.

 <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

liên kết phần tử bạn muốn hướng tiêu điểm vào

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

trong lưới hoặc hộp nhóm, v.v.


4
Uhh yeah, thanks vì đã cho câu trả lời tất cả mọi người cùng khác đã làm ... 4 năm sau ...
Adam Plocher

4
@AdamPlocher Tuyệt vời, bạn đã đưa Sulfian ra khỏi Stack Overflow vĩnh viễn. Thông báo "Chào mừng bạn đến với phần tràn ngăn xếp" sẽ thích hợp hơn.
Contango

2
@Contango: "Nhìn thấy lần cuối Nov 11 '14". Anh ấy đã ra đi từ lâu trước khi Adam đăng bình luận của mình :)
Gone Coding

0

FocusManager không có trong intellisense và điều này làm tôi bối rối một chút. Tôi chỉ cần nhập toàn bộ thuộc tính và nó hoạt động.

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


Microsoft Visual Studio Enterprise 2015 phiên bản 14.0.23107.0/C#/WPF


0

Để hoàn thiện, cũng có một cách để xử lý điều này từ mã phía sau (ví dụ: trong trường hợp các điều khiển, vì bất kỳ lý do gì, được tạo động và không tồn tại trong XAML). Đính kèm một trình xử lý vào sự kiện Đã tải của cửa sổ và sau đó sử dụng phương thức ".Focus ()" của điều khiển bạn muốn. Ví dụ về xương trần bên dưới.

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

Từ thử nghiệm xung quanh, giải pháp xaml

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

dường như hoạt động tốt nhất khi bạn đặt nó ở phần tử cao nhất trong hệ thống phân cấp cửa sổ (thường là Cửa sổ hoặc Lưới mà bạn đặt mọi thứ khác vào)


0

Sử dụng: 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

Tôi có một TextBox bên trong Grid bên trong DataTemplate mà tôi muốn có tiêu điểm bàn phím khi nó hiển thị. Tôi cũng thấy rằng

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

không làm việc cho tôi.

Tuy nhiên, khi tôi gọi Focus () trong ContentControl mẹ

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

nó bắt đầu hoạt động và dấu mũ hiển thị trong TextBox. Tôi nghĩ FocusScope phải được cấp tiêu điểm cho thuộc tính FocusManager.FocusedElement để có bất kỳ tác dụng nào.

Jerry

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.