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. Надеюсь, это поможет-удачи!