[WPF 사용자 정의 컨트롤 라이브러리]가 자동으로 초점로드 양식을하자

1. 수요

첫 번째 입력 상자를로드하거나하게 한 후 초점은 전형적인 "로그인"대화 상자와 같은 매우 기본적인 기능이다. 즉시 집중해야한다 "사용자 이름"로드 일반적으로 "로그인"대화 상자에서, 사용자는 사용자 이름을 입력 클릭해야 Tab로그인을 완료하기 위해 입력을 클릭, 암호를 입력 한 후,하고.

아주 간단해야 WPF에로드 할 때 컨트롤에 포커스를 취득하려면, 단지로드 이벤트 후 전화 Focus()라인에. 하지만 가끔은 양식을 동적으로 추가 또는 폼 요소가 첫 공연에 따라 또는 특정 조건을 숨길, 단순히 첫 번째 컨트롤에 포커스가 수 있도록 어렵다.

이를 위해 나는 FocusService 도구라는 클래스를 만들어,이 문서는 원칙이 클래스의 사용뿐만 아니라 지식의 WPF 포커스를 추가 설명합니다.

2. 구현


public static readonly DependencyProperty IsAutoFocusProperty =
    DependencyProperty.RegisterAttached("IsAutoFocus", typeof(bool), typeof(FocusService), new PropertyMetadata(default(bool), OnIsAutoFocusChanged));

public static bool GetIsAutoFocus(DependencyObject obj) => (bool)obj.GetValue(IsAutoFocusProperty);

public static void SetIsAutoFocus(DependencyObject obj, bool value) => obj.SetValue(IsAutoFocusProperty, value);

private static void OnIsAutoFocusChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args)
{
    var oldValue = (bool)args.OldValue;
    var newValue = (bool)args.NewValue;
    if (oldValue == newValue)
    {
        return;
    }

    if (obj is FrameworkElement target)
    {
        target.Loaded -= OnTargetLoaded;
        if (newValue)
        {
            target.Loaded += OnTargetLoaded;
        }
    }
}

private static void OnTargetLoaded(object sender, RoutedEventArgs e)
{
    var element = sender as FrameworkElement;
    if (System.ComponentModel.DesignerProperties.GetIsInDesignMode(element))
        return;

    var request = new TraversalRequest(FocusNavigationDirection.Next);
    element.MoveFocus(request);
}

위는 추가적인 속성 XAML에서 제어 할 수 있습니다를 만들기 위해, IsAutoFocus 자동으로 초점을 여부를 추가 속성 컨트롤을 사용 FocusService 코드입니다. 이 추가 속성은 컨트롤에, 또한 그리드와 같은 다른 UI 요소뿐만 아니라 사용할 수 있습니다 사용할 수 있습니다. 형태의 추가적인 특성 및 일반적인 성질 전에 언급 디폴트 값은 코드 DefaultStyle 세터에 따라 설정된 기본 값을 설정하지 제공된다.

<Setter Property="local:FocusService.IsAutoFocus"
        Value="True" />

MoveFocus

FrameworkElement에서에 IsAutoFocus연결된 속성 (거짓은 처리하지 않습니다)를 True로 설정되어,이 FrameworkElement에서로드 이벤트 호출됩니다 MoveFocus의 포커스를받을 수 자체에 VisualTree 첫 번째 요소를 키보드 포커스를 이동합니다 기능. 특정 작업 일반적으로 MoveFocus는 방법 VisualTree의 깊이 우선 탐색을 처음 사용할 IsTabStob을 찾을 수 있습니다, Focusable이과에서 IsVisible은 true 및 통화 요소 Keyboard.Focus기능. 소위 "첫 번째는"기본적으로 동일의 직관적이고 사용자의 이해입니다.

DesignerProperties.GetIsInDesignMode

DesignerProperties.GetIsInDesignMode의 요소가 디자이너에서 실행 여부를 결정하는 방법. 너무 강한으로 VisualStudio 디자이너, 거의 WYSIWYG는, 대부분의 코드는 디자인 뷰에서 실행할 수 있습니다. 이 작업을 실행하는 디자인에서 나중에 수행되지 OnTargetLoaded 판단되면, 디자인 뷰가 포커스를받을 때마다 새로 고쳐집니다 방지하는 것입니다.

으로 VisualStudio 디자이너는 정말 강력하지만 데이터가 준비되지 않거나 오류 디자이너가 발생하고 특별한 이유가 간단하고 사용하기 원유 간주 될 수 처리하지 않으려는 경우 여러 가지 이유가 주어지고 있기 때문에 경우에 따라서는 프로그램 것입니다 DesignerProperties.GetIsInDesignMode판단과 직접 수익을.

초점 3. 두 가지 유형

보충 지식으로,이 문서는 간단히 WPF의 초점을 설명합니다.

3.1 키보드 포커스

현재 키보드 포커스를 참조 키보드 입력 UI 요소를 수신한다. 전체 바탕 화면에서 키보드 포커스를 가진 단 하나의 요소가 될 수 있습니다. UI 요소에 초점, 초점 설정 및 취득하기 위해서는에서 IsVisible 그것은 진정한해야합니다. 기본이 아닌 속성 값에 대한 일반적 Focusable이 컨트롤 클래스는 False입니다.

키보드 클래스는 다음과 같이 키보드 포커스를 처리하기 위해 사용될 수있다 :

Keyboard.Focus(FirstTextBox);

초점 성공, UI 요소 경우 기능을 IsKeyboardFocused가 True로 설정하고, 부모 요소 자체 또는 VisualTree 수준이다 IsKeyboardFocusWithin이 사실이 될 것입니다.

VisualTree 초점 기능에로드하지 UI 요소가 성공적으로 실행하지 않는 경우 물론, 보통에만로드 이벤트 후 초점 기능이 실행됩니다.

3.2 논리적 포커스

FocusScope의 논리적 포커스를 말합니다 FocusManager.FocusedElement , 응용 프로그램 요소의 복수가있을 수 있습니다 것은 논리적 포커스를 얻을 수 있지만 키보드 포커스의 한 요소가 얻어진다. 요소에 키보드 포커스가있는 동안 또한 논리적 포커스를 가져옵니다.

FocusScope

에 의해 FocusScope FocusManager.IsFocusScope의 변화.

<StackPanel Name="focusScope1" 
            FocusManager.IsFocusScope="True"
            Height="200" Width="200">
  <Button Name="button1" Height="50" Width="50"/>
  <Button Name="button2" Height="50" Width="50"/>
</StackPanel>
StackPanel focuseScope2 = new StackPanel();
FocusManager.SetIsFocusScope(focuseScope2, true);

FocusedElement

FocusManager를 관리 로직은 또한 사용되는 집중하도록 구성된다 GetFocusedElement (DependencyObject에)를 FocusScope 사용 얻어진 포커스 논리 소자 취득 (DependencyObject에, IInputElement)을하고 setFocusedElement 포커스 논리 엘리먼트로 설정된다.

3.3 윈도우의 논리적 포커스

윈도우 기본 FocusScope, 그것은 정적 생성자 함수의 IsFocusScope에서 진정한합니다 (DefaultStyle에 제공되지 않음)로 설정 :

FocusManager.IsFocusScopeProperty.OverrideMetadata(typeof(Window), new FrameworkPropertyMetadata(true));

창을로드 (또는 창 자체가 활성화 될 때), 포커스 유사 코드 요소 창 논리 포커스를 허용한다.

DependencyObject doContent = Content as DependencyObject;
if (doContent != null)
{
    IInputElement focusedElement = FocusManager.GetFocusedElement(doContent) as IInputElement;
    if (focusedElement != null)
        focusedElement.Focus();
}

4. 결론

사실, 어떤 클래스는, 어쨌든, 코드는 간단합니다, 그냥이 클래스가 추가 속성과 초점의 사용에 소개 된 통과 할 수 없다.

디자이너, 제품 관리자, 개발자의 많은으로 인해 휴대 전화 및 데스크톱 응용 프로그램에 대한 약간 다른 논리적 키보드 네비게이션, 모바일 애플리케이션 개발 및 디자인에 풍부한 경험을 가지고 있기 때문에 키보드 때문에, 특히 지금 할 수있는 사용자 정의 포커스 관리자를 수행 네비게이션 정보는 쉽게 간과 될 수있다.

종종 아니지만 쉽게 누군가가 수요를 제시합니다 느낌의 사용과, 좋은 키보드 탐색을 얻기에 항상 세심한 개발자.

5. 참조

개요 마이크로 소프트 오피스 초점

입력 개요 마이크로 소프트 문서

FocusManager를 클래스 (System.Windows.Input) 마이크로 소프트 문서

Keyboard.Focus (IInputElement) 방법 (System.Windows.Input) 마이크로 소프트 문서

UIElement.MoveFocus (TraversalRequest) 방법 (System.Windows) 마이크로 소프트 문서

6. 소스

Kino.Toolkit.Wpf_FocusService.cs

추천

출처www.cnblogs.com/dino623/p/AutoFocus.html