CellEditingTemplate을 사용하여 DataGrid의 usercontrol을 작성했습니다. 이 편집 템플릿의 DataTemplate은 TextBox이며 커서를 세 번 클릭하여 텍스트 상자로 이동합니다. 두 번 클릭하거나 한 번 클릭하여 텍스트 상자에 커서를 설정하려면 어떻게해야합니까?WPF : CellEditingTemplate 두 번 클릭하거나 클릭하여 내부 컨트롤에 포커스를 설정하는 방법
<Window x:Class="MultiLineEditDataGrid.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:MultiLineEditDataGrid"
Title="MainWindow" Height="350" Width="525">
<Grid DataContext="{Binding Source={x:Static Application.Current}, Path=CompanyManager}">
<Grid.RowDefinitions>
<RowDefinition Height="270"/>
<RowDefinition Height="30"/>
</Grid.RowDefinitions>
<DataGrid ItemsSource="{Binding Companies}" CanUserAddRows="False" AutoGenerateColumns="False">
<DataGrid.Resources>
<DataTemplate x:Key="cellTemplate">
<TextBlock Text="{Binding Description}"/>
</DataTemplate>
<DataTemplate x:Key="cellEditingTemplate">
<local:MultiLineTextBox Text="{Binding Description}"/>
</DataTemplate>
</DataGrid.Resources>
<DataGrid.Columns>
<DataGridTextColumn Header="Company" Binding="{Binding Name}"/>
<DataGridTemplateColumn Header="Description"
CellTemplate="{StaticResource cellTemplate}"
CellEditingTemplate="{StaticResource cellEditingTemplate}"/>
</DataGrid.Columns>
</DataGrid>
<Button Grid.Row="1" Content="Add" Command="{Binding AddCommand}"/>
</Grid>
MultiLineTextBox 내가 텍스트 상자에서 상속 텍스트 상자, 그리고 방법을 onKeyDown에 오버라이드 (override) :
여기 내 코드입니다.
MultiLineTextBox의 코드 :
public class MultiLineTextBox : TextBox
{
/// <summary>
/// On Key Down.
/// </summary>
/// <param name="e"></param>
protected override void OnKeyDown (KeyEventArgs e)
{
base.OnKeyDown (e);
string oldText = Text;
ModifierKeys keys = Keyboard.Modifiers;
if (e.Key == Key.Enter)
{
if ((Keyboard.Modifiers & ModifierKeys.Control).Equals (ModifierKeys.Control))
{
int index = SelectionStart;
oldText = oldText.Insert (index, Environment.NewLine);
Text = oldText;
Select (index + 1, 0);
e.Handled = true;
}
else
{
e.Handled = false;
}
}
else if (e.Key == Key.Escape)
{
Text = oldText;
e.Handled = false;
}
}
}
허용되는 답변보다 단순하며 나에게 잘 맞습니다. 많은 감사합니다. –