WPF의 텍스트 상자에 포커스 설정


105

TextBoxWPF 에서 요소에 포커스를 설정하는 방법

이 코드가 있습니다.

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

...하지만 작동하지 않습니다.

어떤 생각?


txtCompanyID.Focusable = true; Keyboard.Focus (txtCompanyID); 작동하지만 이것이 방법입니다.
MindRoasterMir

답변:


145

XAML에서 :

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

9
나는 MVVM과 일치하기 때문에 위의 다른 접근 방식을 선호합니다.
Todd Sprang 2014

1
Focused element is readonly right 어떻게 xaml에서 설정할 수 있습니까? 나는 이것을 사용했고 작동하지 않았다 <Style.Triggers> <Trigger Property = "Validation.HasError"Value = "True"> <Setter Property = "FocusManager.FocusedElement"Value = "{Binding Source = {RelativeSource Self}}" /> </ Trigger> </Style.Triggers>
WPFKK

@ user841612, 다음 링크를 확인하고 어셈블리 및 네임 스페이스 확인 msdn.microsoft.com/en-us/library/…
usefulBee

이것은 한 번만 작동합니다. 페이지가 빌드 된 후 포커스를 변경하려면 프로그래밍 방식으로 수행해야합니다.
Joe Steele

이것도 작동합니다. txtCompanyID.Focusable = true; Keyboard.Focus (txtCompanyID);
MindRoasterMir

51

아무도 지금까지 질문의 코드가 작동하지 않는 이유를 설명하지 않았습니다. 내 생각 엔 코드가 Window 생성자에 배치되었다는 것입니다. 그러나 현재로서는 초점을 맞추기에는 너무 이르다. Window가 상호 작용할 준비가되면 수행해야합니다. 코드에 가장 적합한 위치는 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 2015

피터 후버의 대답은이 작업을 수행하지만, 창 광산이 작동하지 않는 이유는, 처음로드 될 필요가 있다는 설명
아드리안 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}" />

2
이것은 나에게도 효과적이었습니다. 나머지는 그렇지 않았습니다. 링크 주셔서 감사합니다. 매우 흥미로 웠습니다. 그런 단순한 것이 너무 복잡 할 수 있다는 것도 흥미 롭습니다.
TravisWhidden

2
위의 답변은 컨테이너가 Gird 또는 StackPanel인지 여부에 관계없이 잘 작동합니다. 그리드의 구조가 명확하지 않기 때문에 무엇이 잘못되었는지 알기가 어렵습니다. 그래도 대안을 보니 반갑습니다.
usefulBee

1
나에게 이것은 또한 올바르게 작동하는 유일한 방법입니다. 좋은 방법입니다.
OregonGhost 2016 년

7

다른 답변에서 해결책을 찾지 못한 경우 문제를 해결했습니다.

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

Focus()응용 프로그램이 다른 구성 요소를 렌더링하기 전에 호출이 호출되기 때문에 다른 솔루션이 작동하지 않을 수 있음을 이해합니다 .


3
이 대답은 더 나은 순위를 가질 만합니다.
Simon Mourier


0

Code behind에서는 이렇게해야만 달성 할 수 있습니다.

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

참고 : 창이로드되기 전에는 작동하지 않습니다.

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