WPF: DataGrid как я могу вводить многострочный текст
ребята Я хочу ввести многострочный текст в DataGridTextColumn, я могу использовать "enter" для ввода многострочного символа. Но я хочу использовать "shift+enter", как visual studio resource manager, вот мой код с ключом" enter".
<DataGridTextColumn Header="Value" Binding="{Binding Value}" Width="*">
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="TextWrapping" Value="Wrap" />
</Style>
</DataGridTextColumn.ElementStyle>
<DataGridTextColumn.EditingElementStyle>
<Style TargetType="TextBox">
<Setter Property="TextWrapping" Value="Wrap" />
<Setter Property="AcceptsReturn" Value="true" />
</Style>
</DataGridTextColumn.EditingElementStyle>
1 ответов
один из способов сделать это-обработать событие KeyDown в текстовом поле с помощью EventSetter в вашем стиле. Я взял ваш пример, удалил сеттер AcceptsReturn в стиле и добавил обработчик KeyDown в EditingElementStyle, который добавляет новую строку туда, где был курсор, и перемещает CaretIndex вправо.
вот XAML:
<DataGridTextColumn Header="Value" Binding="{Binding Value}" Width="*">
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="TextWrapping" Value="Wrap" />
</Style>
</DataGridTextColumn.ElementStyle>
<DataGridTextColumn.EditingElementStyle>
<Style TargetType="TextBox">
<Setter Property="TextWrapping" Value="Wrap" />
<EventSetter Event="KeyDown" Handler="OnTextBoxKeyDown"/>
</Style>
</DataGridTextColumn.EditingElementStyle>
</DataGridTextColumn>
Я написал пример в классе Window из нового шаблона проекта приложения, поэтому вот C# для всего Окно с кодом обработки событий. Обратите внимание, что я установил Handled в true, чтобы остановить событие от пузырей в любом месте, поскольку я не хочу, чтобы ключ возврата обрабатывался как фиксация строки редактирования в этом случае. Я думаю, что это на самом деле один из недостатков подхода. Остановка бурления / туннелирования события-это то, что, если у вас есть сложные взаимодействия с пользовательским вводом в вашем приложении, может легко превратиться в логическую бомбу. Но это не так плохо, если у вас есть только один особый случай, как этот. Так как со всем, используйте осторожно, как часть вашего пользовательского интерфейса, используя это растет.
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
this.DataContext = new List<Thing>
{
new Thing { Value = "Some text" },
new Thing { Value = "More text" + Environment.NewLine + " second line" },
new Thing { Value = "Another value" }
};
}
private void OnTextBoxKeyDown(object sender, KeyEventArgs e)
{
if (Key.Return == e.Key &&
0 < (ModifierKeys.Shift & e.KeyboardDevice.Modifiers))
{
var tb = (TextBox)sender;
var caret = tb.CaretIndex;
tb.Text = tb.Text.Insert(caret, Environment.NewLine);
tb.CaretIndex = caret + 1;
e.Handled = true;
}
}
}
public class Thing
{
public string Value { get; set; }
}
еще одна вещь, которую следует учитывать, - это то, что вы можете захотеть, чтобы поведение было другим, если клавиша вставки была нажата, и вы находитесь в режиме переопределения ввода. Возможно, в этом случае следующий символ должен быть заменен новой строкой. Но редактор ресурсов в Visual Studio 2010, похоже, не реагирует на клавишу insert (он также не показывает текст как многострочный). Но я думаю, что данный пример, вы можете расширить его, чтобы хорошо работать с ключом insert. Надеюсь, это поможет-удачи!