키를 누른 이벤트 핸들러 입력
Enter 키를 눌렀을 때 텍스트 상자에서 텍스트를 캡처하고 싶습니다.나는 WPF/visual studio 2010/을 사용하고 있다.NET 4. 태그에 어떤 이벤트 핸들러를 사용해야 하는지 모르겠습니다.마스크 텍스트 상자에도 같은 작업을 수행하려고 합니다.
KeyDown 또는 KeyUp 중 하나.
TextBox tb = new TextBox();
tb.KeyDown += new KeyEventHandler(tb_KeyDown);
static void tb_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter)
{
//enter key is down
}
}
WPF 에서는 PreviewKeyDown 을 사용할 수도 있습니다.
<TextBox PreviewKeyDown="EnterClicked" />
또는 C#:
myTextBox.PreviewKeyDown += EnterClicked;
그리고 첨부 클래스:
void EnterClicked(object sender, KeyEventArgs e) {
if(e.Key == Key.Return) {
DoSomething();
e.Handled = true;
}
}
KeyDown 이벤트는 ENTER 또는 TAB 등이 아닌 "일반" 입력 키에 의해 표준 TextBox 또는 MaskedTextBox에서만 트리거되었습니다.
IsInputKey 메서드를 덮어쓰면 ENTER와 같은 특수 키를 얻을 수 있습니다.
public class CustomTextBox : System.Windows.Forms.TextBox
{
protected override bool IsInputKey(Keys keyData)
{
if (keyData == Keys.Return)
return true;
return base.IsInputKey(keyData);
}
}
KeyDown 이벤트를 다음과 같은 방법으로 사용할 수 있습니다.
CustomTextBox ctb = new CustomTextBox();
ctb.KeyDown += new KeyEventHandler(tb_KeyDown);
private void tb_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter)
{
//Enter key is down
//Capture the text
if (sender is TextBox)
{
TextBox txb = (TextBox)sender;
MessageBox.Show(txb.Text);
}
}
}
WPF에서 TextBox 요소는 속성을 설정하지 않을 때까지 "Enter" 버튼을 사용하여 KeyUp 이벤트를 생성할 수 없습니다.AcceptsReturn="맞아요.
그러나 TextBox 요소의 KeyUp Event 처리 문제는 해결되지 않습니다.ENTER를 누르면 TextBox에 새 텍스트 행이 표시됩니다.
저는 버블 이벤트 전략을 이용하여 TextBox 요소의 KeyUp Event 사용 문제를 해결했습니다.그것은 짧고 쉽다.KeyUp 이벤트핸들러는, 다음의 몇개의 부모 요소에 접속할 필요가 있습니다.
XAML:
<Window x:Class="TextBox_EnterButtomEvent.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:TextBox_EnterButtomEvent"
mc:Ignorable="d"
Title="MainWindow" Height="350" Width="525">
<Grid KeyUp="Grid_KeyUp">
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height ="0.3*"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<TextBlock Grid.Row="1" Grid.Column="1" Padding="0" TextWrapping="WrapWithOverflow">
Input text end press ENTER:
</TextBlock>
<TextBox Grid.Row="2" Grid.Column="1" HorizontalAlignment="Stretch"/>
<TextBlock Grid.Row="4" Grid.Column="1" Padding="0" TextWrapping="WrapWithOverflow">
You have entered:
</TextBlock>
<TextBlock Name="txtBlock" Grid.Row="5" Grid.Column="1" HorizontalAlignment="Stretch"/>
</Grid></Window>
C# 논리 부품(KeyUp 이벤트핸들러는 그리드 요소에 접속되어 있습니다):
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void Grid_KeyUp(object sender, KeyEventArgs e)
{
if(e.Key == Key.Enter)
{
TextBox txtBox = e.Source as TextBox;
if(txtBox != null)
{
this.txtBlock.Text = txtBox.Text;
this.txtBlock.Background = new SolidColorBrush(Colors.LightGray);
}
}
}
}
결과:
TextBox 또는 기타 입력 컨트롤에서 Enter 키를 캡처하는 데 어려움을 겪고 있는 사용자는 양식에 AcceptButton이 정의되어 있는 경우 KeyDown 이벤트를 사용하여 Enter 키를 캡처할 수 없습니다.
양식 수준에서 Enter 키를 잡아야 합니다.다음 코드를 양식에 추가합니다.
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
if ((this.ActiveControl == myTextBox) && (keyData == Keys.Return))
{
//do something
return true;
}
else
{
return base.ProcessCmdKey(ref msg, keyData);
}
}
언급URL : https://stackoverflow.com/questions/3752451/enter-key-pressed-event-handler
'programing' 카테고리의 다른 글
명령 프롬프트에서 .exe를 실행하는 Bat 파일 (0) | 2023.04.21 |
---|---|
bash에서는 어떻게 전류 입력을 클리어합니까? (0) | 2023.04.21 |
SQL Server에서 사용자 정의 테이블 유형 변경 (0) | 2023.04.16 |
Bash의 HMAC-SHA1 (0) | 2023.04.16 |
Bash 파일 확장자는 무엇입니까? (0) | 2023.04.16 |