Как узнать, какое письмо пользователь щелкнул в текстовом блоке WPF - PullRequest
2 голосов
/ 15 июля 2010

У меня есть TextBlock, который представляет текст.Когда пользователь нажимает на текст, он динамически заменяется на TextBox (который связан с теми же данными), фактически переключаясь в «режим редактирования».Это также значительно повышает производительность.

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

Ответы [ 3 ]

1 голос
/ 21 июля 2010

соответственно, решение довольно простое и понятное. Тем не менее, он по-прежнему использует TextBox, а не TextBlock. Следующий метод получает MouseButtonEventArgs из события щелчка мыши и TextBox, который вызвал событие и возвращает текстовый индекс, по которому щелкнул пользователь.

private int GetMouseClickPosition(MouseButtonEventArgs mouseButtonEventArgs, 
                                  TextBox textBox1)
    {
        Point mouseDownPoint = mouseButtonEventArgs.GetPosition(textBox1);
        return textBox1.GetCharacterIndexFromPoint(mouseDownPoint, true);
    }
1 голос
/ 15 июля 2010

Попробуйте это:

  1. Создать TextBox
  2. Создать стиль с именем LockedTextBoxStyle
    • BorderThickness: 0
    • IsReadOnly: True
    • IsReadOnlyCaretVisible: True
    • Курсор: Стрелка
  3. Создать триггер для IsKeyboardFocused При значении true установите стиль на LockedTextBoxStyle

Поскольку IsReadOnlyCaretVisible имеет значение true, я надеюсь, что это сохранит позицию каретки. Еще не тестировали.

0 голосов
/ 04 февраля 2018

Немного поздно, но я боролся с той же проблемой, и вот решение, которое я придумал, хотя и грубое, может показаться, что оно работает просто отлично:

<Window x:Class="MyWindow.MainWindow"
...
...
<TextBlock MouseLeftButtonUp="TextBlock_OnMouseLeftButtonUp">Here is some Text</TextBlock>
<TextBox Name="TextBox1" Width="150"></TextBox>

Затем вкод позади:

private void TextBlock_OnMouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
    TextBlock tb = sender as TextBlock;
    TextPointer tp = tb.GetPositionFromPoint(e.GetPosition(tb), false);

    int index = tp.GetLineStartPosition(0).GetOffsetToPosition(tp) - 1;

    TextBox1.Text = tb.Text;
    TextBox1.Focus();
    TextBox1.CaretIndex = index;

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