Событие вставки Wpf добавляет текст дважды [дубликат]

Используйте git rebase -i и замените «pick» на второй и последующие фиксации «squash» или «fixup», как описано в в руководстве .

В этом примере , является либо хэшем SHA1, либо относительным местоположением из HEAD текущей ветви, из которого анализируются коммиты для команды rebase. Например, если пользователь хочет просмотреть 5 коммитов от текущего HEAD, команда git rebase -i HEAD~5.

17
задан Dave 30 September 2011 в 22:25
поделиться

4 ответа

16
ответ дан Fredrik Hedblad 1 September 2018 в 05:54
поделиться

Просто некоторые изменения кода @ Fredrik, так как я тестировал оба его метода.

Первый - это только сокращенная версия

private void TextBox_Pasting(object sender, DataObjectPastingEventArgs e)
{
    string clipboard = e.DataObject.GetData(typeof(string)) as string;
    Regex nonNumeric = new System.Text.RegularExpressions.Regex (@"\D");
    string result = nonNumeric.Replace(clipboard, string.Empty);

    int caret = CaretIndex;
    Text = Text.Substring(0, SelectionStart) + result +
        Text.Substring(SelectionStart + SelectionLength);
    CaretIndex = caret + result.Length;

    e.CancelCommand();
}

, а другая один из них обновляется с сохранением содержимого буфера обмена

private string oldClipboardContent { get; set; } = "";
private bool pasteModified { get; set; } = false;

private void TextBox_Pasting(object sender, DataObjectPastingEventArgs e)
{
    if (pasteModified)
    {
        pasteModified = false;
    }
    else
    {
        pasteModified = true;

        string text = (string)e.DataObject.GetData(typeof(string));
        oldClipboardContent = text;

        Regex nonNumeric = new System.Text.RegularExpressions.Regex (@"\D");
        text = nonNumeric.Replace(text, string.Empty);
        e.CancelCommand();

        Clipboard.SetData(DataFormats.Text, text);
        ApplicationCommands.Paste.Execute(text, this);

        Clipboard.SetData(DataFormats.Text, OldClipboardContent);
        oldClipboardContent = "";
    }
}

Я использовал те, что были внутри моего настраиваемого элемента управления TextBox, поэтому я мог получить доступ к свойствам TextBox, не записывая сначала имя.

0
ответ дан Adder 1 September 2018 в 05:54
поделиться

Вы не можете вызвать args.DataObject.SetData («некоторые данные»), поскольку объект DataObject заморожен. Вы можете полностью заменить DataObject:

private void TextBoxPaste(object sender, DataObjectPastingEventArgs e) {
        string text = (String)e.DataObject.GetData(typeof(String));
        DataObject d = new DataObject();
        d.SetData(DataFormats.Text, text.Replace(Environment.NewLine, " "));
        e.DataObject = d;
 }
25
ответ дан Farawin 1 September 2018 в 05:54
поделиться

Я использую VB.net совсем немного, я тестировал этот бит C #, я использовал конвертер, потому что я хромой:)

    string oClipboard;

    private void TextBox1_GotFocus(object sender, System.EventArgs e)
    {
        oClipboard = Clipboard.GetText();
        Clipboard.SetText("foo");
    }

    private void TextBox1_LostFocus(object sender, System.EventArgs e)
    {
        Clipboard.SetText(oClipboard);
    }

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

0
ответ дан FreeSnow 1 September 2018 в 05:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: