【비망록】 복수행 텍스트 박스로 개행과 IME 확정을 구분한다

9531 단어 C#IMEWPF
요구 사항은 다음과 같습니다.
  • 복수행 입력 가능한 TextBox로
  • 일본어 입력과 영어 입력이 혼합 된 상태에서
  • IME 입력 확인에 반응하지 않고
  • 개행을 나타내는 Enter 키가 눌려진 것을 검출한다

  • (Visual Studio 2019 · .NET Framework4.7.2)

    요건 1



    만드는 것만.

    MainWindow.xaml
    
    <Window x:Class="sample.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            xmlns:local="clr-namespace:sample"
            mc:Ignorable="d"
            Title="MainWindow" Height="450" Width="800">
        <Grid>
            <TextBox x:Name="Txtbox" Margin="20,20,20,20" Padding="5,5,5,5" Text=""
                     AcceptsReturn="True" VerticalScrollBarVisibility="Visible" HorizontalScrollBarVisibility="Auto"/>
        </Grid>
    </Window>
    
    

    할 수 있었다.






    요건 2~4



    확인을 위해 우선 보통으로 KeyDown을 감지해 본다.

    MainWindow.xaml
    
        <Grid>
            <TextBox x:Name="Txtbox" Margin="20,20,20,20" Padding="5,5,5,5" Text=""
                     AcceptsReturn="True" VerticalScrollBarVisibility="Visible" HorizontalScrollBarVisibility="Auto"
                     KeyDown="Txtbox_KeyDown"/>
        </Grid>
    
    

    MainWindow.xaml.cs
    
    private void Txtbox_KeyDown(object sender, KeyEventArgs e)
    {
        Console.WriteLine("{0}が押されました!", e.Key.ToString());
    }
    
    

    이것으로 좋아.






    어째서 야넨.

    영어 입력만 감지할 수 있는 것 같습니다.

    작전 변경



    Enter 키가 물리적으로 눌려져 있는지 확인합니다. Ctrl 키나 Shift 키를 눌렀을 경우의 동작은 별도 준비하면 된다.

    MainWindow.xaml.cs
    
    private void Txtbox_KeyDown(object sender, KeyEventArgs e)
    {
        if (Keyboard.IsKeyDown(Key.Return))
        {
            Console.WriteLine("Enterキーが押されました!");
        }
    }
    
    

    이것으로 좋아.






    어째서 야넨.

    방금 전의 결과와 함께 생각하면, IME 확정도 개행도 KeyDown 이벤트로서 인식되고 있지 않은 것 같다.

    또한 작전 변경



    감지할 이벤트를 변경합니다.

    MainWindow.xaml
    
        <Grid>
            <TextBox x:Name="Txtbox" Margin="20,20,20,20" Padding="5,5,5,5" Text=""
                     AcceptsReturn="True" VerticalScrollBarVisibility="Visible" HorizontalScrollBarVisibility="Auto"
                     PreviewKeyDown="Txtbox_PreviewKeyDown"/>
        </Grid>
    
    

    MainWindow.xaml.cs
    
    private void Txtbox_PreviewKeyDown(object sender, KeyEventArgs e)
    {
        Console.WriteLine("{0}が押されました!", e.Key.ToString());
    }
    
    







    안돼.

    MainWindow.xaml.cs
    
    private void Txtbox_PreviewKeyDown(object sender, KeyEventArgs e)
    {
        if (e.Key.ToString() == "Return")
        {
            Console.WriteLine("改行されました!");
            // ここ、正しくは、「改行されそう!」ですが、そんなことは気にしない。
        }
    }
    
    







    완벽합니다.

    결국



    PreviewKeyDown 이벤트로, e.Key.ToString() == "Return" 를 판정해 주면 된다.

    덧붙여서 왜 이것을 비망록으로 남기게 되었는가 하면, 넷에서 조사하면 TextChanged 이벤트로, 텍스트 박스의 행수가 바뀌면 개행한다고 하는 코드가 먼저 나오고, 수수께끼 구현 걸기 시작했기 때문.
    덧붙여서, TextChanged 이벤트를 사용하면(자), 마지막 Enter가 개행으로서 사용되고 나서 이벤트가 발화하게 되기 때문에, 그것을 허용하지 않는 요건의 경우 원래 사용할 수 없다. (즉, 「아이 우에오」의 「이」와 「우」사이에 커서가 있는 상태로, 이벤트를 발화시키려고 Enter하면, 먼저 개행이 들어가기 때문에, 「아이\r\n우에오」를 처리 하는 날개가 된다.)
    그 점, PreviewKeyDown 이벤트를 사용하면, e.Handled = true; 로서 하는 것으로, 키 이벤트의 처리를 명시적으로 종료할 수 있으므로, 그 걱정도 없다.

    덧붙여서, KeyEventArgs.ImeProcessedKey 라는 것도 있는 것 같지만, 이것은 영어권에서 사용되는 문자를 쳤을 때는 전부 None 를 돌려주므로, 이번과 같이 개행을 검지하고 싶다면, 하면 사용할 수 없는 일도 없다.
    그렇지 않고, IME 확정을 검지하고 싶다면, Keyboard.IsKeyDown(Key.Return) && e.ImeProcessedKey.ToString() == "None" 가 되므로, 강한 아군이 될 것 같다.

    좋은 웹페이지 즐겨찾기