none
Позиция символа в Paragraph. RRS feed

  • Вопрос

  • Есть Paragraph с некоторым текстом. Пользователь кликает по любому символу в этом параграфе, а обработчик возвращает позицию этого символа. Как это реализовать?

    Спасибо.

    30 ноября 2011 г. 15:44

Ответы

  • > Как теперь сделать то же самое с Touch? [...] Выдаёт ошибку типа "нельзя преобразовать Point в TouchPoint...". Как преобразовать-то?
     
     
    void RichTextBox_PreviewTouchDown(object sender, System.Windows.Input.TouchEventArgs e)
    {
        var rtb = sender as RichTextBox;
        var p = e.GetTouchPoint(rtb);
        var c = rtb.GetPositionFromPoint(p.Position, true);
        var s = rtb.Document.ContentStart.GetOffsetToPosition(c);
    }
    
        
    • Помечено в качестве ответа MIchaelBourkanov 2 декабря 2011 г. 10:55
    2 декабря 2011 г. 10:46
  • > Есть Paragraph с некоторым текстом. Пользователь кликает по любому символу в этом параграфе, а обработчик возвращает позицию этого символа. Как это реализовать?


    какой тип проекта: WinForms или WPF?
    для WPF примерно так:
     
    private void RichTextBox_PreviewMouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
    {
        var rtb = sender as RichTextBox;
        var c = rtb.GetPositionFromPoint(e.GetPosition(rtb), true);
        var s = rtb.Document.ContentStart.GetOffsetToPosition(c);
        System.Diagnostics.Trace.WriteLine(s);
    }

       
    • Изменено Malobukv 1 декабря 2011 г. 14:23
    • Предложено в качестве ответа Malobukv 2 декабря 2011 г. 10:46
    • Помечено в качестве ответа MIchaelBourkanov 2 декабря 2011 г. 10:55
    1 декабря 2011 г. 14:15

Все ответы

  • > Есть Paragraph с некоторым текстом. Пользователь кликает по любому символу в этом параграфе, а обработчик возвращает позицию этого символа. Как это реализовать?


    какой тип проекта: WinForms или WPF?
    для WPF примерно так:
     
    private void RichTextBox_PreviewMouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
    {
        var rtb = sender as RichTextBox;
        var c = rtb.GetPositionFromPoint(e.GetPosition(rtb), true);
        var s = rtb.Document.ContentStart.GetOffsetToPosition(c);
        System.Diagnostics.Trace.WriteLine(s);
    }

       
    • Изменено Malobukv 1 декабря 2011 г. 14:23
    • Предложено в качестве ответа Malobukv 2 декабря 2011 г. 10:46
    • Помечено в качестве ответа MIchaelBourkanov 2 декабря 2011 г. 10:55
    1 декабря 2011 г. 14:15
  • Отлично работает! Спасибо!

    Проект WPF.

     Как теперь сделать то же самое с Touch?

     Сделал такой код :

     Private Sub RichTextBox1_PreviewTouchDown(ByVal sender As Object, ByVal e As System.Windows.Input.TouchEventArgs) Handles RichTextBox1.PreviewTouchDown
            Dim c = sender.GetPositionFromPoint(e.GetTouchPoint(sender), True)
            Dim s = sender.Document.ContentStart.GetOffsetToPosition(c)
            System.Diagnostics.Trace.WriteLine(s)GetTouchPoint 
    End Sub
    

    Выдаёт ошибку типа "нельзя преобразовать Point в TouchPoint...". Как преобразовать-то?

    И ещё вопрос: почему GetOffsetToPosition выдаёт позицию символа со смещением? Т.е. я кликаю по первому символу, а он пишет, что это символ 2.
     


    2 декабря 2011 г. 10:32
  • > Как теперь сделать то же самое с Touch? [...] Выдаёт ошибку типа "нельзя преобразовать Point в TouchPoint...". Как преобразовать-то?
     
     
    void RichTextBox_PreviewTouchDown(object sender, System.Windows.Input.TouchEventArgs e)
    {
        var rtb = sender as RichTextBox;
        var p = e.GetTouchPoint(rtb);
        var c = rtb.GetPositionFromPoint(p.Position, true);
        var s = rtb.Document.ContentStart.GetOffsetToPosition(c);
    }
    
        
    • Помечено в качестве ответа MIchaelBourkanov 2 декабря 2011 г. 10:55
    2 декабря 2011 г. 10:46
  • Ай, спасибо! Чудесно!
    2 декабря 2011 г. 10:55
  • > почему GetOffsetToPosition выдаёт позицию символа со смещением? Т.е. я кликаю по первому символу, а он пишет, что это символ 2.

     
    если кликнуть перед первым символом то выводит 2, если сдвинуть на пиксель левее, то - 1.
    скорее всего учитываются какие-то невидимые символы/теги.
     
     
    2 декабря 2011 г. 11:00
  • C RTB все отлично работает. Но как быть если параграф является дочерним элементом, например, FlowDocumentScrollviewer, который не позволяет редактировать документы, а только просматривать?  Т.е. мне нужна позиция не относительно всего FlowDocument, а относительно одного конкретного Paragraph, по которому кликает пользователь... Выдаёт ошибку, что "Общий член "GetPositionFromPoint" для типа "Paragraph" не найден".

    Sender в данном случае не RTB, а конкретный Paragraph.

    2 декабря 2011 г. 11:13