На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
  
> Рассчет высоты Label для вписания заданного текста. , CF3.5, WM5
    Есть форма. На ней метка (Label), в эту метку надо вписать заранее неизвестный текст. Проблема в том, что текст может быть сильно разной длины и нужно что бы он весь поместился.

    Сделал так:
    ExpandedWrap disabled
              private void LblQuestionText_TextChanged(object sender, EventArgs e)
              {
                  var g = CreateGraphics();
                  try
                  {
                      var oldLabelSize = lblQuestionText.Size;
                      var s = g.MeasureString(lblQuestionText.Text, lblQuestionText.Font);
       
                      var newlabelHeight = Convert.ToInt32( s.Height * (s.Width/oldLabelSize.Width + 2 ));
       
                      lblQuestionText.Size = new Size(oldLabelSize.Width, newlabelHeight);
       
                      var oldParentSize = lblQuestionText.Parent.Size;
       
                      lblQuestionText.Parent.Size = new Size(oldParentSize.Width,
                                                             oldParentSize.Height + (newlabelHeight - oldLabelSize.Height));
                  }
                  finally
                  {
                      g.Dispose();
                  }
              }


    В принципе все работает. Но проблема в том, что перенос текста идет по пробелам, поэтому если текст состоит из достаточно длинных слов (ну или не удачно расположенных), то для того, что бы он поместился целиком надо добавлять несколько строк (в коде (s.Width/oldLabelSize.Width + 2 ). Для CF нет перегруженного метода, который бы принимал еще и ширину.

    Может кто решал подобную проблему? Как правильно посчитать высоту с учетом переносов? Не хочется самому выдумывать и городить перебор по словам...

    ЗЫЖ TextBox и иже не подходят, потому что позволяют текст выделять, даже если readonly, а нужно что бы он был просто написан на форме, как это делает Label.
      В общем сделал так:

      ExpandedWrap disabled
                private void LblQuestionText_TextChanged(object sender, EventArgs e)
                {
                    using( var g = CreateGraphics() )
                    {
         
                        var newLabelSize = GetNewLabelHeigth(g, lblQuestionText.Text, lblQuestionText.Font, lblQuestionText.Size.Width);
                        pnlQuestion.Height += newLabelSize.Height - lblQuestionText.Size.Height;
                        lblQuestionText.Height = newLabelSize.Height;
                        
                    }
                }
         
                private static Size GetNewLabelHeigth(Graphics g, string text, Font font, int lineWidth)
                {
                    var words = text.Split(' ');
                    var lineHeight = 0;
                    var line = new StringBuilder();
                    var lineCount = 1;
         
                    foreach (var word in words)
                    {
                        line.AppendFormat("{0} ", word);
         
                        var s = g.MeasureString(line.ToString(), font);
                        var newLineHeight = Convert.ToInt32(s.Height);
                        if (newLineHeight > lineHeight) lineHeight = newLineHeight;
         
                        if (s.Width < lineWidth) continue;
         
                        lineCount++;
                        line = new StringBuilder().AppendFormat("{0} ", word);
                    }
         
                    return new Size(lineWidth, lineHeight * lineCount);
                }


      Может кто лучше чего придумает?
      0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
      0 пользователей:


      Рейтинг@Mail.ru
      [ Script execution time: 0,0160 ]   [ 16 queries used ]   [ Generated: 26.12.24, 14:29 GMT ]