xaml wpf의 텍스트 상자에 포커스 설정


91

이 포럼 및 다른 게시물에 대한 일부 게시물에도 불구하고 .NET에 초점을 맞추는 방법을 알려주는 내용을 찾을 수 없습니다 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()XAML에서이 작업을 수행하지 않으려는 경우 코드 숨김에서 사용할 수도 있습니다 .


13
@TarkaDaal : "나를 위해 작동하지 않았다"는 코멘트가 좀 더 정교해질 수 있습니다. 초점을 훔치는 또 다른 컨트롤 일 것입니다. WPF에서 초점 전쟁이 시작되면 상황이 좋지 않은 경향이 있습니다! 컨트롤과 현재 시각적 트리에있는 위치를 확인하십시오 (예 : ComboBox 템플릿 내부에서는 효과가 없으며 이와 유사한 다른 경우가 많이 있음). 스틸러를 찾을 수없는 경우 비헤이비어 또는 코드 숨김을 사용하여 컨트롤이로드 될 때 포커스를 설정합니다.
Julien Lebosquain

@JulienLebosquain : 그것은 매우 간단한 컨트롤, 두 개의 버튼과 Grid 내의 TextBox (내가 FocusManager물건을 넣는 곳 )였습니다. 결국 저는 코드 숨김에서 해냈습니다.
TarkaDaal

"FocusedElement"멤버가 인식되지 않거나 액세스 할 수 없습니다. :( plus.google.com/photos/+HendyIrawan/albums/5990385944888867505/…
Hendy Irawan

@HendyIrawan Silverlight 프로젝트일까요?
MojoFilter

그것은 @MojoFilter 윈도우 폰 8 WPF 프로젝트입니다
Hendy 이르 완

26

이 속성을 TextBox에 직접 적용 할 수 있습니다.

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

17
나를 위해 작동하지 않았고, 컨테이너에 FocusManager.FocusedElement = "{Binding ElementName = TxtB}"설정이 작동했습니다
Grant

1
매력처럼 작동하며 이름을 지정할 필요가 없습니다.
Simon Mattes 2015

1
나에게도 효과가 없었습니다. 뭔가 빠졌나요?
BrunoLM 2015

1
나에게도 작동하지 않았습니다. Julien Lebosquain 작업의 제안.
Crypt32

1
나에게도 작동하지 않습니다. 제안 된 다른 모든 방법도 작동하지 않습니다. 이 문제는 초보적이어야하며 쉽게 해결할 수 있어야합니다. 그래서 많은 ppl이 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}"

그리드 또는 그룹 상자 등


4
그래 어, 다른 같은 대답 모두를주는 감사하십시오 4 년 후 ... 한
아담 Plocher에게

4
@AdamPlocher 좋은 사람, Sulfian을 Stack Overflow에서 영구적으로 해제했습니다. "스택 오버플로에 오신 것을 환영합니다"메시지가 더 적절할 것입니다.
Contango

2
@Contango : "마지막 본 Nov 11 '14". 그는 한 떠난지 오래 아담이 그의 코멘트 : 게시하기 전에
사라 코딩

0

FocusManager는 지능적이지 않아서 약간 혼란 스러웠습니다. 전체 속성을 입력했는데 제대로 작동했습니다.

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

창 계층 구조에서 가장 높은 요소 (일반적으로 Window 또는 다른 모든 항목을 배치 한 Grid)에 배치 할 때 가장 잘 작동하는 것 같습니다.


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 내부의 Grid 내부에 TextBox가 있으며 표시 될 때 키보드 포커스를 원합니다. 나는 또한 발견했다

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

나를 위해 작동하지 않았습니다.

그러나 부모 ContentControl에서 Focus ()를 호출하면

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

작동하기 시작하고 캐럿이 TextBox에 표시됩니다. FocusManager.FocusedElement 속성이 효과를 내려면 FocusScope에 포커스가 있어야한다고 생각합니다.

실내 변기

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.