Подтвердить что ты не робот

FastColoredTextbox AutoWordSelection?

FastColoredTextbox - это пользовательский элемент управления, который можно загрузить в этот URL, он выглядит следующим образом:

enter image description here

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

Я не нашел никакой информации, объясняющей проблему, и все официальные проекты примеров имеют эту проблему.

Никто не знает, как сделать AutoWordSelection эквивалент по умолчанию TextBox для элемента управления FastColoredTextbox, но даже самое главное:

Как выбрать только несколько слов с помощью мыши?

UPDATE:

@ mostruash ответ очень поучителен, но за все это время я не мог выполнить изменения самостоятельно.

Мне нужна огромная помощь программиста на С# для выполнения этой задачи, мои знания о С# очень малы, и изменения, которые я сделал для источника, не сработали (не скомпилированы), я вернулся к оригиналу пользовательский источник управления, чтобы не испортить больше. Я ненавижу говорить об этом, но на этот раз мне нужна работа, этот источник слишком для меня.

Если я запрашиваю слишком много, возможно, с необходимыми расширенными инструкциями разработчика С#, объясняя, как это сделать шаг за шагом, возможно, я мог бы выполнить это самостоятельно.

ОБНОВЛЕНИЕ

Видео, которое демонстрирует проблему:

https://www.youtube.com/watch?v=Cs2Sh2tMvII

ОБНОВЛЕНИЕ

Еще одна демонстрация, я показываю, что делать FastColoredTextbox не может, но я хотел бы сделать это, как и любой другой текстовый редактор:

enter image description here

4b9b3361

Ответ 1

Я проверил исходный код проекта. Перетаскивание отменяется, если происходит двойной щелчок и вызывается SelectWord.

Вы можете изменить исходный код, чтобы включить функцию, которую вы запрашиваете. (https://github.com/PavelTorgashov/FastColoredTextBox). В этом случае:

  • Вы должны отслеживать выбор, начинающийся с двойных щелчков.
  • Вместо вызова функции SelectWord используйте атрибут Selection и draggedRange, чтобы пометить выбранное слово в OnMouseMove.
  • Вы также должны обрабатывать отбраковку слов в OnMouseMove.
  • Вы также должны выбирать пробелы между словами в OnMouseMove.

Двойной щелчок обрабатывается в фрагменте кода ниже:

            if (!isLineSelect)
            {
                var p = PointToPlace(e.Location);

                if (e.Clicks == 2)
                {
                    mouseIsDrag = false; //Here, drag is cancelled. 
                    mouseIsDragDrop = false;
                    draggedRange = null; //Drag range is nullified

                    SelectWord(p); //SelectWord is called to mark the word
                    return;
                }

                if (Selection.IsEmpty || !Selection.Contains(p) || this[p.iLine].Count <= p.iChar || ReadOnly)
                    OnMouseClickText(e);
                else
                {
                    mouseIsDragDrop = true;
                    mouseIsDrag = false;
                }
            }

ИЗМЕНИТЬ:

Для этого может потребоваться много работы. Поэтому, возможно, вам следует использовать другой инструмент/библиотеку. Я не изучил весь исходный код, поэтому, возможно, будут дополнительные шаги для тех, которые были предоставлены выше.

Например, для отслеживания двойных щелчков вы можете сделать следующее:

  • Определите переменную класса/свойство в FastColoredTextbox.cs: bool isDoubleClick.
  • Установите значение true в OnMouseDown в <<212 > . Установите его в false во всех других условиях.
  • Установите значение false в OnMouseClick или OnMouseUp или в других соответствующих обработчиках событий мыши.

Таким образом, вы узнаете, началась ли серия событий мыши с события двойного щелчка или нет. Затем вы будете действовать соответственно в OnMouseMove, потому что именно вы (un) отмечаете символы или (un) отмечаете слова.

ПОСЛЕДНИЕ СЛОВА ПРЕДОСТЕРЕЖЕНИЯ:

Автор этого проекта не включал никаких встроенных комментариев или каких-либо других средств документации, поэтому вы будете изучать код за строкой, чтобы понять, что делает каждая функция/часть.

Ответ 2

Добавьте следующий класс между строкой 5276 и строкой 5277 в классе FastColoredTextBox.cs:

SelectWord(p);
mouseIsDrag = true; // here
return;

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

Ответ 3

Как указывает @mostruash в своем ответе, это место, где автор отменяет перетаскивание мышью. Не знаю, почему он намеренно предотвращает эту функцию. Только он знает.

if (e.Clicks == 2)//Line 5270
{
    mouseIsDrag = false;
    mouseIsDragDrop = false;
    draggedRange = null;

    SelectWord(p);
    return;
}

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

if (e.Clicks == 2)//Line 5270
{
    //Comment or remove completely.

    //mouseIsDrag = false;
    //mouseIsDragDrop = false;
    //draggedRange = null;

    SelectWord(p);
    return;
}

Примечание: Не уверен, что это сломает что-то еще, я не тестировал. По крайней мере, это работает. Испытай сам.

Ответ 4

Мое решение немного настраивается, но, похоже, работает на первый взгляд.

Вы должны внести некоторые изменения в код:

  • Добавьте флаг mouseIsWholeWordSelection и переменную Range, которая может сохранить начальный выбранный диапазон после двойного щелчка (лучше всего после строки 100, я думаю):

    private bool mouseIsWholeWordSelection;
    private Range mouseIsWholeWordSelectionBaseRange;
    
  • Измените код выбора для события двойного щелчка, как указано выше, и немного увеличьте его (строка 5222):

                if (e.Clicks == 2)
                {
                    //mouseIsDrag = false;
                    mouseIsDragDrop = false;
                    mouseIsWholeWordSelection = true;
                    //draggedRange = null;
    
                    SelectWord(p);
                    mouseIsWholeWordSelectionBaseRange = Selection.Clone();
                    return;
                }
    
  • Добавить оценку события перетаскивания для воссоздания выделения (строка 5566):

                else if (place != Selection.Start)
            {
                if (mouseIsWholeWordSelection)
                {
                    Selection.BeginUpdate();
                    var oldSelection = Selection.Clone();
                    SelectWord(place);
    
                    if (Selection.End >= mouseIsWholeWordSelectionBaseRange.End)
                    {
                        Selection.Start = (mouseIsWholeWordSelectionBaseRange.Start > Selection.Start) ? mouseIsWholeWordSelectionBaseRange.Start : Selection.Start;
                        Selection.End = mouseIsWholeWordSelectionBaseRange.End;
                    }
                    else if (Selection.Start < mouseIsWholeWordSelectionBaseRange.End)
                    {
                        Selection.Start = new Place(Selection.End.iChar, Selection.End.iLine);
                        Selection.End = mouseIsWholeWordSelectionBaseRange.Start;
                    }
    
                    Selection.EndUpdate();
                    DoCaretVisible();
                    Invalidate();
                }
                else
                {
                    Place oldEnd = Selection.End;
                    Selection.BeginUpdate();
                    if (Selection.ColumnSelectionMode)
                    {
                        Selection.Start = place;
                        Selection.ColumnSelectionMode = true;
                    }
                    else
                        Selection.Start = place;
                    Selection.End = oldEnd;
                    Selection.EndUpdate();
                    DoCaretVisible();
                    Invalidate();
                }
                return;
            }
    
  • Добавить в любое место, где isMouseDrag устанавливается в false:

    isMouseWholeWordSelection = false;
    

И там вы идете.