Share via


키보드 이벤트

키보드 이벤트 및 포커스

하드웨어 및 터치 키보드 모두에 대해 다음과 같은 키보드 이벤트가 발생할 수 있습니다.

이벤트 설명
KeyDown 키를 누를 때 발생합니다.
KeyUp 키를 놓을 때 발생합니다.

Important

일부 XAML 컨트롤은 내부적으로 입력 이벤트를 처리합니다. 이러한 경우 이벤트 수신기가 연결된 처리기를 호출하지 않으므로 입력 이벤트가 발생하지 않는 것처럼 보일 수 있습니다. 일반적으로 이 키 하위 집합은 기본 키보드 접근성을 지원하기 위해 클래스 처리기에서 처리됩니다. 예를 들어, Button 클래스는 스페이스 키와 Enter 키 모두(OnPointerPressed도)에 대해 OnKeyDown 이벤트를 재정의 하며 이를 컨트롤의 Click 이벤트로 라우팅합니다. 컨트롤 클래스에서 키 누름을 처리하는 경우 KeyDownKeyUp 이벤트가 발생하지 않습니다.
단추를 손가락으로 탭하거나 마우스로 클릭하는 것과 유사하게 단추를 호출하는 것과 동일한 기본 제공 키보드를 제공합니다. Space 또는 Enter 이외의 키는 여전히 KeyDownKeyUp 이벤트를 발생시킵니다. 이벤트 클래스 기반 처리의 작동 방식(특히 "컨트롤의 입력 이벤트 처리기" 섹션)에 대한 자세한 내용은 이벤트 및 라우트된 이벤트 개요를 참조하세요.

UI의 컨트롤은 입력 포커스가 있는 경우에만 키보드 이벤트를 생성합니다. 개별 컨트롤은 사용자가 레이아웃에서 해당 컨트롤을 직접 클릭하거나 탭하거나 Tab 키를 사용하여 콘텐츠 영역 내에서 탭 시퀀스를 한 단계씩 실행할 때 포커스를 얻습니다.

컨트롤의 포커스 메서드를 호출하여 포커스를 강제 적용할 수도 있습니다. UI를 로드할 때 키보드 포커스가 기본적으로 설정되지 않으므로 바로 가기 키를 구현할 때 필요합니다. 자세한 내용은 이 항목의 뒷부분에 있는 바로 가기 키 예제를 참조하세요.

입력 포커스를 받으려면 컨트롤을 사용하도록 설정하고 표시하며 IsTabStopHitTestVisible 속성 값이 true여야 합니다. 이것은 대부분의 컨트롤에 대한 기본 상태입니다. 컨트롤에 입력 포커스가 있는 경우 이 항목의 뒷부분에 설명된 대로 키보드 입력 이벤트를 발생시키고 응답할 수 있습니다. GotFocusLostFocus 이벤트를 처리하여 포커스를 받거나 잃어버리는 컨트롤에 응답할 수도 있습니다.

기본적으로 컨트롤의 탭 시퀀스는 XAML(Extensible Application Markup Language)에 표시되는 순서입니다. 그러나 TabIndex 속성을 사용하여 이 순서를 수정할 수 있습니다. 자세한 내용은 키보드 접근성 구현을 참조하세요.

키보드 이벤트 처리기

입력 이벤트 처리기는 다음 정보를 제공하는 대리자를 구현합니다.

  • 이벤트 발신자. 발신자는 이벤트 처리기가 연결된 개체를 보고합니다.
  • 이벤트 데이터. 키보드 이벤트의 경우 해당 데이터는 KeyRoutedEventArgs의 인스턴스가 됩니다. 처리기의 대리자는 KeyEventHandler입니다. 대부분의 처리기 시나리오에서 관련성이 가장 큰 KeyRoutedEventArgs의 속성은 KeyKeyStatus입니다.
  • OriginalSource. 키보드 이벤트는 라우트된 이벤트이므로 이벤트 데이터는 OriginalSource를 제공합니다. 의도적으로 이벤트가 개체 트리 를 통해 버블 업되도록 허용하는 경우 OriginalSource는 발신자가 아닌 관심의 개체일 수 있습니다. 그러나 이는 디자인에 따라 다릅니다. 발신자 대신 OriginalSource를 사용하는 방법에 관한 자세한 내용은 이 항목의 "키보드 라우트된 이벤트" 섹션 또는 이벤트 및 라우트된 이벤트 개요를 참조하세요.

키보드 이벤트 처리기 연결

이벤트를 멤버로 포함하는 모든 개체에 대해 키보드 이벤트 처리기 함수를 연결할 수 있습니다. 여기에는 모든 UIElement 파생 클래스가 포함됩니다. 다음 XAML 예제는 GridKeyUp 이벤트 처리기를 연결하는 방법을 보여줍니다.

<Grid KeyUp="Grid_KeyUp">
  ...
</Grid>

코드에서 이벤트 처리기를 연결할 수도 있습니다. 자세한 내용은 이벤트 및 라우트된 이벤트 개요를 참조하세요.

키보드 이벤트 처리기 정의

다음 예제는 이전 예제에서 연결한 KeyUp 이벤트의 불완전한 이벤트 처리기 정의를 보여줍니다.

void Grid_KeyUp(object sender, KeyRoutedEventArgs e)
{
    //handling code here
}
Private Sub Grid_KeyUp(ByVal sender As Object, ByVal e As KeyRoutedEventArgs)
    ' handling code here
End Sub
void MyProject::MainPage::Grid_KeyUp(
  Platform::Object^ sender,
  Windows::UI::Xaml::Input::KeyRoutedEventArgs^ e)
  {
      //handling code here
  }

KeyRoutedEventArgs 사용

모든 키보드 이벤트에서 이벤트 데이터에 KeyRoutedEventArgs를 사용하며 KeyRoutedEventArgs에는 다음 속성이 포함됩니다.

가상 키

키를 누르면 KeyDown 이벤트가 발생합니다. 그리고 키가 해제되어도 KeyUp이 발생합니다. 일반적으로 이벤트를 수신 대기하여 특정 키 값을 처리합니다. 누르거나 놓을 키를 확인하려면 이벤트 데이터의 Key 값을 확인합니다. Key에서 VirtualKey 값을 반환합니다. VirtualKey 열거형에는 지원되는 모든 키가 포함됩니다.

보조 키

한정자 키는 사용자가 일반적으로 다른 키와 함께 누르는 Ctrl 또는 Shift와 같은 키입니다. 앱에서 이러한 조합을 사용자 지정 바로 가기 키로 사용하여 앱 명령을 호출할 수 있습니다.

참고 항목

기본 제공 바로 가기 키는 액세스 키키보드 가속기를 참조하세요.

KeyDownKeyUp 이벤트 처리기에서 바로 가기 키 조합을 검색할 수 있습니다. 비보조 키에 대해 키보드 이벤트가 발생하는 경우 보조 키가 누른 상태인지 여부도 확인할 수 있습니다.

또는 CoreWindowGetKeyState() 함수(CoreWindow.GetForCurrentThread()를 통해 획득)를 사용하여 비보조 키를 누를 때 한정자 상태를 확인할 수도 있습니다.

다음 예제에서는 첫 번째 구현에 대한 스텁 코드도 포함하면서 이 두 번째 메서드를 구현합니다.

참고 항목

Alt 키는 VirtualKey.Menu 값으로 표시됩니다.

바로 가기 키 예

다음 예제에서는 사용자 지정 바로 가기 키 집합을 구현하는 방법을 보여 줍니다. 이 예제에서는 재생, 일시 중지 및 중지 단추 또는 Ctrl+P, Ctrl+A 및 Ctrl+S 바로 가기 키를 사용하여 미디어 재생을 제어할 수 있습니다. 단추 XAML은 단추 레이블에서 도구 설명 및 AutomationProperties 속성을 사용하여 바로 가기를 표시합니다. 이 자가 문서화는 앱의 유용성과 접근성을 높이는 데 중요합니다. 자세한 내용은 키보드 접근성을 참조하세요.

또한 페이지가 로드될 때 입력 포커스를 자체로 설정합니다. 이 단계를 거치지 않으면 컨트롤에 초기 입력 포커스가 생기지 않아 사용자가 입력 포커스를 수동으로 설정(예: 컨트롤을 탭하거나 클릭)할 때까지 앱이 입력 이벤트를 발생시키지 않습니다.

<Grid KeyDown="Grid_KeyDown">

  <Grid.RowDefinitions>
    <RowDefinition Height="Auto" />
    <RowDefinition Height="Auto" />
  </Grid.RowDefinitions>

  <MediaElement x:Name="DemoMovie" Source="xbox.wmv"
    Width="500" Height="500" Margin="20" HorizontalAlignment="Center" />

  <StackPanel Grid.Row="1" Margin="10"
    Orientation="Horizontal" HorizontalAlignment="Center">

    <Button x:Name="PlayButton" Click="MediaButton_Click"
      ToolTipService.ToolTip="Shortcut key: Ctrl+P"
      AutomationProperties.AcceleratorKey="Control P">
      <TextBlock>Play</TextBlock>
    </Button>

    <Button x:Name="PauseButton" Click="MediaButton_Click"
      ToolTipService.ToolTip="Shortcut key: Ctrl+A"
      AutomationProperties.AcceleratorKey="Control A">
      <TextBlock>Pause</TextBlock>
    </Button>

    <Button x:Name="StopButton" Click="MediaButton_Click"
      ToolTipService.ToolTip="Shortcut key: Ctrl+S"
      AutomationProperties.AcceleratorKey="Control S">
      <TextBlock>Stop</TextBlock>
    </Button>

  </StackPanel>

</Grid>
//showing implementations but not header definitions
void MainPage::OnNavigatedTo(NavigationEventArgs^ e)
{
    (void) e;    // Unused parameter
    this->Loaded+=ref new RoutedEventHandler(this,&amp;MainPage::ProgrammaticFocus);
}
void MainPage::ProgrammaticFocus(Object^ sender, RoutedEventArgs^ e) 
{
    this->Focus(Windows::UI::Xaml::FocusState::Programmatic);
}

void KeyboardSupport::MainPage::MediaButton_Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e)
{
    FrameworkElement^ fe = safe_cast<FrameworkElement^>(sender);
    if (fe->Name == "PlayButton") {DemoMovie->Play();}
    if (fe->Name == "PauseButton") {DemoMovie->Pause();}
    if (fe->Name == "StopButton") {DemoMovie->Stop();}
}


bool KeyboardSupport::MainPage::IsCtrlKeyPressed()
{
    auto ctrlState = CoreWindow::GetForCurrentThread()->GetKeyState(VirtualKey::Control);
    return (ctrlState & CoreVirtualKeyStates::Down) == CoreVirtualKeyStates::Down;
}

void KeyboardSupport::MainPage::Grid_KeyDown(Platform::Object^ sender, Windows::UI::Xaml::Input::KeyRoutedEventArgs^ e)
{
    if (e->Key == VirtualKey::Control) isCtrlKeyPressed = true;
}


void KeyboardSupport::MainPage::Grid_KeyUp(Platform::Object^ sender, Windows::UI::Xaml::Input::KeyRoutedEventArgs^ e)
{
    if (IsCtrlKeyPressed()) 
    {
        if (e->Key==VirtualKey::P) { DemoMovie->Play(); }
        if (e->Key==VirtualKey::A) { DemoMovie->Pause(); }
        if (e->Key==VirtualKey::S) { DemoMovie->Stop(); }
    }
}
protected override void OnNavigatedTo(NavigationEventArgs e)
{
    // Set the input focus to ensure that keyboard events are raised.
    this.Loaded += delegate { this.Focus(FocusState.Programmatic); };
}

private void MediaButton_Click(object sender, RoutedEventArgs e)
{
    switch ((sender as Button).Name)
    {
        case "PlayButton": DemoMovie.Play(); break;
        case "PauseButton": DemoMovie.Pause(); break;
        case "StopButton": DemoMovie.Stop(); break;
    }
}

private static bool IsCtrlKeyPressed()
{
    var ctrlState = CoreWindow.GetForCurrentThread().GetKeyState(VirtualKey.Control);
    return (ctrlState & CoreVirtualKeyStates.Down) == CoreVirtualKeyStates.Down;
}

private void Grid_KeyDown(object sender, KeyRoutedEventArgs e)
{
    if (IsCtrlKeyPressed())
    {
        switch (e.Key)
        {
            case VirtualKey.P: DemoMovie.Play(); break;
            case VirtualKey.A: DemoMovie.Pause(); break;
            case VirtualKey.S: DemoMovie.Stop(); break;
        }
    }
}
Private isCtrlKeyPressed As Boolean
Protected Overrides Sub OnNavigatedTo(e As Navigation.NavigationEventArgs)

End Sub

Private Function IsCtrlKeyPressed As Boolean
    Dim ctrlState As CoreVirtualKeyStates = CoreWindow.GetForCurrentThread().GetKeyState(VirtualKey.Control);
    Return (ctrlState & CoreVirtualKeyStates.Down) == CoreVirtualKeyStates.Down;
End Function

Private Sub Grid_KeyDown(sender As Object, e As KeyRoutedEventArgs)
    If IsCtrlKeyPressed() Then
        Select Case e.Key
            Case Windows.System.VirtualKey.P
                DemoMovie.Play()
            Case Windows.System.VirtualKey.A
                DemoMovie.Pause()
            Case Windows.System.VirtualKey.S
                DemoMovie.Stop()
        End Select
    End If
End Sub

Private Sub MediaButton_Click(sender As Object, e As RoutedEventArgs)
    Dim fe As FrameworkElement = CType(sender, FrameworkElement)
    Select Case fe.Name
        Case "PlayButton"
            DemoMovie.Play()
        Case "PauseButton"
            DemoMovie.Pause()
        Case "StopButton"
            DemoMovie.Stop()
    End Select
End Sub

참고 항목

XAML에서 AutomationProperties.AcceleratorKey 또는 AutomationProperties.AccessKey를 설정하면 특정 작업을 호출하기 위한 바로 가기 키를 문서화하는 문자열 정보가 제공됩니다. 정보는 내레이터와 같은 Microsoft UI 자동화 클라이언트에 의해 캡처되며 일반적으로 사용자에게 직접 제공됩니다.

AutomationProperties.AcceleratorKey 또는 AutomationProperties.AccessKey를 설정해도 자체적으로 아무 작업도 수행되지 않습니다. 앱에서 바로 가기 키 동작을 실제로 구현하려는 경우에도 KeyDown 또는 KeyUp 이벤트용 처리기를 연결해야 합니다. 액세스 키에 대한 밑줄 텍스트 장식도 자동으로 제공되지 않습니다. UI에 밑줄이 그어진 텍스트를 표시하려면 니모닉의 특정 키에 대한 텍스트를 인라인 밑줄 서식으로 명시적으로 밑줄을 지정해야 합니다.

 

키보드 라우트된 이벤트

특정 이벤트는 KeyDownKeyUp을 포함하는 라우트된 이벤트입니다. 라우트된 이벤트는 버블링 라우트 전략을 사용합니다. 버블링 라우팅 전략은 이벤트가 자식 개체에서 시작된 다음 개체 트리의 연속 부모 개체로 라우팅됨을 의미합니다. 이렇게 하면 동일한 이벤트를 처리하고 동일한 이벤트 데이터와 상호 작용할 수 있는 또 다른 기회가 제공됩니다.

다음 XAML 예제를 고려해보세요. 여기서는 CanvasButton 개체 두 개에 대한 KeyUp 이벤트를 처리합니다. 이 경우 Button 개체에서 포커스를 보유하는 동안 키를 해제하면 KeyUp 이벤트가 발생합니다. 그런 다음, 이 이벤트가 부모 Canvas로 버블링됩니다.

<StackPanel KeyUp="StackPanel_KeyUp">
  <Button Name="ButtonA" Content="Button A"/>
  <Button Name="ButtonB" Content="Button B"/>
  <TextBlock Name="statusTextBlock"/>
</StackPanel>

다음 예제에서는 앞의 예제에서 해당 XAML 콘텐츠에 대한 KeyUp 이벤트 처리기를 구현하는 방법을 보여줍니다.

void StackPanel_KeyUp(object sender, KeyRoutedEventArgs e)
{
    statusTextBlock.Text = String.Format(
        "The key {0} was pressed while focus was on {1}",
        e.Key.ToString(), (e.OriginalSource as FrameworkElement).Name);
}

이전 처리기에서 OriginalSource 속성을 사용한 것에 유의하세요. 여기서 OriginalSource는 이벤트를 발생시킨 개체를 보고합니다. 이 개체는 StackPanel이 될 수 없는데 그 이유는 StackPanel은 컨트롤이 아니라 포커스를 가질 수 없기 때문입니다. StackPanel 내 단추 두 개만 이벤트를 발생시킬 수 있는데 둘 중 어느 것일까요? 부모 개체에서 이벤트를 처리하는 경우 OriginalSource를 사용하여 실제 이벤트 원본 개체를 구분합니다.

이벤트 데이터의 Handled 속성

이벤트 처리 전략에 따라 하나의 이벤트 처리기만 버블링 이벤트에 대응해야 할 수 있습니다. 예를 들어, 특정 KeyUp 처리기가 Button 컨트롤 중 하나와 연결된 경우 해당 이벤트를 먼저 처리할 기회가 생깁니다. 이 경우 부모 패널이 해당 이벤트를 처리하지 않게 해야 합니다. 이 시나리오는 이벤트 데이터에서 Handled 속성을 사용할 수 있습니다.

라우트된 이벤트 데이터 클래스에서 Handled 속성의 목적은 이전에 이벤트 경로에 등록한 다른 처리기가 이미 작동했음을 보고하는 것입니다. 이는 라우트된 이벤트 시스템의 동작에 영향을 줍니다. 이벤트 처리기에서 Handledtrue로 설정하면 해당 이벤트가 라우팅을 중지하고 연속 부모 요소로 전송되지 않습니다.

AddHandler 및 이미 처리된 키보드 이벤트

처리된 것으로 이미 표시된 이벤트에 대해 작용할 수 있는 처리기를 연결할 때 특수 기술을 사용할 수 있습니다. 이 기술은 XAML 특성 또는 C#에서 += 등의 처리기를 추가하는 언어별 구문을 사용하는 대신 AddHandler 메서드를 사용하여 처리기를 등록합니다.

이 기술의 일반적인 제한 사항은 AddHandler API가 라우트된 해당 이벤트를 나타내는 RoutedEvent 유형의 매개 변수를 사용한다는 것입니다. 라우트된 모든 이벤트가 RoutedEvent 식별자를 제공하는 것은 아니며, 따라서 이 고려 사항은 Handled 경우에서도 처리할 수 있는 라우트된 이벤트에 영향을 줍니다. KeyDownKeyUp 이벤트는 라우트된 이벤트 식별자(KeyDownEventKeyUpEvent)가 UIElement에 있습니다. 그러나 TextBox.TextChanged 같은 이벤트는 라우트된 이벤트 식별자가 없어 AddHandler 기술과 함께 사용할 수 없습니다.

키보드 이벤트 및 동작 재정의

키보드 및 게임 패드를 비롯한 다양한 입력 장치에 일관된 포커스 탐색을 제공하도록 특정 컨트롤(예: GridView)에 대한 키 이벤트를 재정의할 수 있습니다.

다음 예제에서는 화살표 키를 누를 때 GridView 콘텐츠로 포커스가 이동하도록 컨트롤의 하위 클래스를 설정하고 KeyDown 동작을 재정의하겠습니다.

  public class CustomGridView : GridView
  {
    protected override void OnKeyDown(KeyRoutedEventArgs e)
    {
      // Override arrow key behaviors.
      if (e.Key != Windows.System.VirtualKey.Left && e.Key !=
        Windows.System.VirtualKey.Right && e.Key !=
          Windows.System.VirtualKey.Down && e.Key !=
            Windows.System.VirtualKey.Up)
              base.OnKeyDown(e);
      else
        FocusManager.TryMoveFocus(FocusNavigationDirection.Down);
    }
  }

참고 항목

레이아웃에만 GridView를 사용하는 경우 ItemsControl 같은 다른 컨트롤을 ItemsWrapGrid와 함께 사용하는 것이 좋습니다.

명령

소수의 UI 요소에서 명령에 대한 기본 제공 지원을 제공합니다. 명령은 그 기본 구현에서 입력 관련 라우트된 이벤트를 사용합니다. 이를 통해 단일 명령 처리기를 호출하여 특정 포인터 작업 또는 특정 가속기 키와 같은 관련 UI 입력을 처리할 수 있습니다.

UI 요소에 명령을 사용할 수 있는 경우에는 개별 입력 이벤트 대신 명령 API를 사용하는 것이 좋습니다. 자세한 내용은 ButtonBase.Command을 참조하세요.

ICommand를 구현하여 일반 이벤트 처리기에서 호출하는 명령 기능을 캡슐화할 수도 있습니다. 이렇게 하면 사용할 수 있는 Command 속성이 없는 경우에도 명령을 사용할 수 있습니다.

텍스트 입력 및 컨트롤

특정 컨트롤은 자체 처리로 키보드 이벤트에 반응합니다. 예를 들어, TextBox는 키보드를 사용하여 입력한 텍스트를 캡처한 다음 시각적으로 표현하도록 설계된 컨트롤입니다. 자체 논리에서 KeyUpKeyDown을 사용한 다음 텍스트가 실제로 변한 경우에도 자체 TextChanged 이벤트를 발생시킵니다.

일반적으로 KeyUpKeyDown용 처리기를 TextBox 또는 텍스트 입력 처리용 관련 처리기에 추가할 수 있습니다. 그러나 의도한 디자인의 일부로 컨트롤이 키 이벤트를 통해 전달되는 모든 키 값에 응답하지 않을 수 있습니다. 동작은 각 컨트롤에 따라 다릅니다.

예를 들어, ButtonBase(Button의 기본 클래스)는 KeyUp을 처리하여 스페이스바 또는 Enter 키에 대해 검사할 수 있습니다. ButtonBaseKeyUpClick 이벤트를 발생시킬 목적으로 마우스 왼쪽 단추를 누르는 것으로 간주합니다. 이 이벤트 처리는 ButtonBase가 가상 메서드 OnKeyUp를 재정의할 때 수행됩니다. 그 구현에서 Handledtrue로 설정합니다. 그 결과 스페이스바의 경우 키 이벤트를 수신 대기하는 단추의 부모가 자체 처리기에 대해 이미 처리된 이벤트를 수신하지 않습니다.

또 다른 예는 TextBox입니다. 화살표 키와 같은 일부 키는 TextBox에서 텍스트로 간주되지 않고 컨트롤 UI 동작과 관련된 것으로 간주됩니다. TextBox는 이러한 이벤트 클래스를 처리된 것으로 표시합니다.

사용자 지정 컨트롤은 OnKeyDown / OnKeyUp을 재정의하여 키 이벤트의 유사한 자체 재정의 동작을 구현할 수 있습니다. 사용자 지정 컨트롤이 특정 가속기 키를 처리하거나 TextBox에 대해 설명한 시나리오와 유사한 컨트롤 또는 포커스 동작이 있는 경우 자체 OnKeyDown / OnKeyUp 재정의에 이 논리를 배치해야 합니다..

터치 키보드

텍스트 입력 컨트롤은 터치 키보드를 자동으로 지원합니다. 사용자가 터치 입력을 사용하여 입력 포커스를 텍스트 컨트롤로 설정하면 터치 키보드가 자동으로 나타납니다. 입력 포커스가 텍스트 컨트롤에 없으면 터치 키보드가 숨겨집니다.

터치 키보드가 나타나면 포커스가 있는 요소가 계속 표시되도록 UI의 위치를 자동으로 변경합니다. 이로 인해 UI의 다른 중요한 영역이 화면에서 벗어날 수 있습니다. 그러나 기본 동작을 사용하지 않도록 설정하고 터치 키보드가 표시되면 고유한 UI를 조정할 수 있습니다. 자세한 내용은 터치 키보드 샘플을 참조하세요.

텍스트 입력이 필요하지만 표준 텍스트 입력 컨트롤에서 파생되지 않는 사용자 지정 컨트롤을 만드는 경우 올바른 UI 자동화 컨트롤 패턴을 구현하여 터치 키보드 지원을 추가할 수 있습니다. 자세한 내용은 터치 키보드 샘플을 참조하세요.

터치 키보드의 키 누름은 하드웨어 키보드의 키 누름과 마찬가지로 KeyDownKeyUp 이벤트를 발생시킵니다. 그러나 터치 키보드는 입력 컨트롤에서 텍스트 조작을 위해 예약된 Ctrl+A, Ctrl+Z, Ctrl+X, Ctrl+C 및 Ctrl+V에 대한 입력 이벤트를 발생시키지 않습니다.

사용자가 입력할 것으로 예상되는 데이터 종류와 일치하도록 텍스트 컨트롤의 입력 범위를 설정하여 사용자가 앱에서 데이터를 쉽고 빠르게 입력할 수 있도록 지원할 수 있습니다. 입력 범위는 시스템에서 해당 입력 형식에 특수한 터치 키보드를 제공할 수 있도록 컨트롤에서 예상되는 텍스트 입력 형식에 대한 힌트를 시스템에 제공합니다. 예를 들어 텍스트 상자가 4자리 숫자의 PIN을 입력하는 목적으로만 사용될 경우 InputScope 속성을 Number로 설정합니다. 이렇게 하면 사용자가 PIN을 쉽게 입력할 수 있도록 시스템에서 숫자 키패드 레이아웃이 표시됩니다. 자세한 내용은 입력 범위를 사용하여 터치 키보드 변경을 참조하세요.

개발자

디자이너

샘플

보관 샘플