locked
Сколько слов из длинной строки полностью заполнят TextBlock? RRS feed

  • Вопрос

  • Есть длинная строка, которая не помещается в TextBlock, я хочу узнать, сколько слов из этой строки полностью заполнят TextBlock. Хочу реализовать постраничный вывод длинного текста. Для этого необходимо разбивать этот текст в правильных местах.

    В библиотеке Graphics можно узнать длину текста определенного шрифта и размера, в Windows Forms также есть эта возможность, сделать в Windows Store Apps не получилось.

    3 октября 2012 г. 13:50

Ответы

  • Привет.

    Попробуйте такой способ расчета длины текста - How can I calculate the width of a string in Metro (without displaying it)?

    Но такой способ позволит узнать только длину всего текста и вам придется скорей всего подбирать слова пока они не поместятся в заданный прямоугольник.

    Можно еще попробовать вариант отсюда - Get Displayed Text from TextBlock


    Для связи [mail]

    4 октября 2012 г. 10:28
  • Дмитрий, я видел обе эти ссылки, вторая не может быть использована, т.к. там используется System.Drawing.dll. По первой ссылке можно решить мою задачу, но очень уж медленным способом. Ниже код по определению высоты, которую займет текст в TextBlock:

    public class TextBlockManager { TextBlock _textBlock; double _width; double _height; public TextBlockManager(double fontSize, FontFamily fontFamily, double widht, double height, TextWrapping textWrapping = TextWrapping.Wrap, TextAlignment textAligment = TextAlignment.Justify) { _width = widht; _height = height; _textBlock = new TextBlock { FontSize = fontSize, FontFamily = fontFamily, VerticalAlignment = Windows.UI.Xaml.VerticalAlignment.Top, HorizontalAlignment = Windows.UI.Xaml.HorizontalAlignment.Left, TextWrapping = textWrapping, TextAlignment = textAligment, Width = _width }; } public double GetHeightText(string text) { _textBlock.Text = text; // Очень медленный метод. _textBlock.Measure(new Size(_width, Double.MaxValue)); return _textBlock.DesiredSize.Height; }

    }

    Далее пишем алгоритм, который с наименьшим обращением к GetHeightText(string text) найдет нужное количество слов. Тут можно расчитать среднее количество слов на странице и брать эту величину в качестве начального приближения.


    5 октября 2012 г. 7:29

Все ответы

  • Привет.

    Попробуйте такой способ расчета длины текста - How can I calculate the width of a string in Metro (without displaying it)?

    Но такой способ позволит узнать только длину всего текста и вам придется скорей всего подбирать слова пока они не поместятся в заданный прямоугольник.

    Можно еще попробовать вариант отсюда - Get Displayed Text from TextBlock


    Для связи [mail]

    4 октября 2012 г. 10:28
  • Дмитрий, я видел обе эти ссылки, вторая не может быть использована, т.к. там используется System.Drawing.dll. По первой ссылке можно решить мою задачу, но очень уж медленным способом. Ниже код по определению высоты, которую займет текст в TextBlock:

    public class TextBlockManager { TextBlock _textBlock; double _width; double _height; public TextBlockManager(double fontSize, FontFamily fontFamily, double widht, double height, TextWrapping textWrapping = TextWrapping.Wrap, TextAlignment textAligment = TextAlignment.Justify) { _width = widht; _height = height; _textBlock = new TextBlock { FontSize = fontSize, FontFamily = fontFamily, VerticalAlignment = Windows.UI.Xaml.VerticalAlignment.Top, HorizontalAlignment = Windows.UI.Xaml.HorizontalAlignment.Left, TextWrapping = textWrapping, TextAlignment = textAligment, Width = _width }; } public double GetHeightText(string text) { _textBlock.Text = text; // Очень медленный метод. _textBlock.Measure(new Size(_width, Double.MaxValue)); return _textBlock.DesiredSize.Height; }

    }

    Далее пишем алгоритм, который с наименьшим обращением к GetHeightText(string text) найдет нужное количество слов. Тут можно расчитать среднее количество слов на странице и брать эту величину в качестве начального приближения.


    5 октября 2012 г. 7:29
  • Спасибо, что поделились своим вариантом решения проблемы.

    Для связи [mail]

    8 октября 2012 г. 9:10