【비망록】 복수행 텍스트 박스로 개행과 IME 확정을 구분한다
(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"
가 되므로, 강한 아군이 될 것 같다.
Reference
이 문제에 관하여(【비망록】 복수행 텍스트 박스로 개행과 IME 확정을 구분한다), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/NumLocker/items/2d235185228ec3b691ec텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)