Посторонний перевод строки на данные, скопированные из WPF DataGrid - PullRequest
3 голосов
/ 04 октября 2011

При стандартном поведении копирования / вставки в WPF DataGrid кажется, что после копирования копируется новая строка, будь то содержимое одной ячейки или нескольких строк.

Есть ли простой способсделать так, чтобы этот символ новой строки не помещался в скопированный текст?

Полагаю, я мог бы сделать что-то вроде прослушивания Ctrl-C, выполнения команды application.copy, а затем замены данных, которые были скопированы, версией сnewline сорвал.Это кажется ужасно грязным, хотя.Есть ли лучший способ?

Ответы [ 3 ]

1 голос
/ 05 октября 2011

Если вы используете WPF DataGrid, обработайте его событие с именем dataGrid.CopyingRowClipboardContent

. В обработчике проверьте, если

 if ((DataGridRow)sender.DataContext
        == dataGrid.SelectedItems.GetItemAt(dataGrid.SelectedItems.Count - 1))
 {
     var lastRowData = e.ClipboardRowContent;
     //// manipulate Clipboard to remove new line.
 }

Надеюсь, это направит вас в правильном направлении.

1 голос
/ 05 октября 2011

В итоге я выбрал грязное решение, которое я описал выше.Это работает, но наверняка кажется, что должен быть лучший способ сделать это.Возможно, в будущем они добавят событие, которое подключается в нужное время, чтобы иметь возможность редактировать все содержимое буфера обмена непосредственно перед их установкой.

    private RelayCommand _resultsGridCopyCommand;
    public RelayCommand ResultsGridCopyCommand {
        get {
            if (_resultsGridCopyCommand == null) {
                _resultsGridCopyCommand = new RelayCommand(this.CopyFromResultsGrid);
            }

            return _resultsGridCopyCommand;
        }
    }

    private void CopyFromResultsGrid(object grid) {
        var resultsGrid = (DataGrid)grid;
        ApplicationCommands.Copy.Execute(null, resultsGrid);

        var oldData = Clipboard.GetDataObject();
        var newData = new DataObject();

        foreach (var format in oldData.GetFormats()) {
            if (format.Equals("UnicodeText") || format.Equals("Text")) {
                newData.SetData(format, Regex.Replace(((String)oldData.GetData(format)), "\r\n$", ""));
            } else {
                newData.SetData(format, oldData.GetData(format));
            }
        }

        Clipboard.SetDataObject(newData);
    }
0 голосов
/ 04 октября 2011

Я думаю, что самое простое решение вместо подключения событий ОС и всей этой путаницы, это просто удалить пустую строку из строки, которая будет помещена в ячейку, непосредственно перед вставкой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...