Переопределенное перетаскивание производного элемента управления текстового поля WPF OnPreviewDrop (диез C) - PullRequest
0 голосов
/ 17 ноября 2009

Я работал над своим пользовательским элементом управления, полученным из TextBox, и столкнулся с проблемой, которую не могу решить прямо сейчас.Краткое описание проблемы: мое текстовое поле содержит простой текст, содержащий теги, которые я хочу сохранить согласованными - до сих пор я переопределил выделение текста, поэтому их можно было выбирать только как целый тег и т. Д. Сейчас я перешел к обработке перетаскивания.Если какой-либо текст будет добавлен в текстовое поле и он будет добавлен в тег, я хочу, чтобы вставка была перемещена до или после тега.Актуальная проблема с настройкой e.Handled = true.Если я установлю его в true, это почти сработает - текст вставляется через мою процедуру, но не удаляется из источника.Если я установлю его в false, после выполнения моего метода будет запущен метод вставки исходного текстового поля.Есть ли способ изменить маршрутизацию событий?Или я подхожу к этому неправильно с самого начала?

Код моего метода: защищенное переопределение void OnPreviewDragEnter (DragEventArgs e) {base.OnPreviewDragEnter (e);e.Handled = true;// давайте нарисуем нашу собственную карету ...}

    protected override void OnPreviewDrop(DragEventArgs e)
    {
        base.OnPreviewDrop(e);

        fieldsReady = false;
        int selStart = this.SelectionStart;
        int selLength = this.SelectionLength;

        string droppedData = (string)e.Data.GetData(DataFormats.StringFormat);



        // where to insert
        Point whereDropped = e.GetPosition(this);
        int droppedIndex = GetCharacterIndexFromPoint(whereDropped, true);
        if (droppedIndex == this.Text.Length - 1)
        {
            double c = GetRectFromCharacterIndex(droppedIndex).X;
            if (whereDropped.X > c)
                droppedIndex++;
        }


        // only if the source was us, do this:
        if (this.SelectionLength > 0) // this means that we are dragging from our textbox!
        {

            // was there any selection? if so, remove it!
            this.Text = this.Text.Substring(0, selStart) + this.Text.Substring(selStart + selLength);
            e.Handled = true;

            // 2DO!! alter the indices depending on the removed selection

            // insertion
            this.Text = this.Text.Substring(0, droppedIndex) + droppedData + this.Text.Substring(droppedIndex);

        } 

     }

1 Ответ

0 голосов
/ 17 марта 2010

Установка e.Effects в вашем обработчике OnPreviewDrop может дать результаты. По моему опыту, текст был удален из источника. Установка e.Effects = DragDropEffects.Copy оставляет мой исходный текст в покое, что является моим желаемым поведением. Возможно, DragDropEffects.Move поможет вам при установке e.Handled = true.

...