Решение, какую строку отображать в зависимости от ширины элемента управления - PullRequest
0 голосов
/ 13 июля 2011

У меня есть список в SplitterPanel. Я переопределил его методы MeasureItem () и DrawItem ().

В зависимости от Listbox.Width я хочу вернуть всю строку или ее сокращенную версию, например «Dance toni ...».

Я просмотрел SO и нашел два вопроса, которые касаются моей проблемы. Одной из проблем является измерение ширины текста, что я делаю с помощью e.Graphics.MeasureString () в DrawItem ().

Сводка - У меня есть ширина списка и ширина строки в пикселях. Если строка короче ширины списка, я хочу отобразить строку целиком. Однако, если он длиннее, я хотел бы вернуть версию типа «Привет всем ...», которая бы помещалась в пределах ширины списка.

Пока у меня есть:

        private string FitText(string s)
    {
        int width = (TextRenderer.MeasureText(s, titleFont)).Width;
        if (width <= mailList.Width)
        {
            return s;
        }
        else if (width > mailList.Width)
        {
            // What goes here?
        }
    }

Я почти уверен, что это просто математика, но я все еще не могу понять.

Ответы [ 3 ]

1 голос
/ 13 июля 2011

Вот псевдокод, который я бы использовал ...

1) Сократить строку в некоторой форме (удалить последний символ / слово)
2) Повторно протестируйте длину против width
3) Вставка действительного повтора, если не
4) Если строка слишком короткая, используйте форму по умолчанию

String s = "A long string that you're trying to fit into the button."
while (width > mailList.Width) {
   s = s.SubString(0,s.lastIndexOf(" ")-1); //Change this to whatever you'd want to shorten the string by
  width = (TextRenderer.MeasureText(s, titleFont)).Width; 
  if (width < 5) { //Some value indicating it's too short
    s = "Button...";
    break;
  }
}

return s;
1 голос
/ 13 июля 2011

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

string EllipsisString = "..."; // you could also just set this as the unicode ellipsis char if that displays properly

private string FitText(string s)
{
    bool WidthFound = true;
    string TestString = s;
    string StringToReturn = s;

    int width = (TextRenderer.MeasureText(s, titleFont)).Width;

    if (width > mailList.Width)
    {
        WidthFound = false;

        for (int i=1; i < s.Length; ++i)
        {
           TestString = s.Substring(0, s.Length - i) + EllipsisString;
           width = (TextRenderer.MeasureText(TestString, titleFont)).Width;

           if (width <= mailList.Width)
           {
              StringToReturn = TestString;
              WidthFound = true;
              break;
           }
        }
    }

    if (WidthFound)
        return StringToReturn;
    else
        return EllipsisString;
}

[правок: слишком много, чтобы назвать]

1 голос
/ 13 июля 2011

http://msdn.microsoft.com/en-us/library/aa904308%28v=vs.71%29.aspx

    string ts = s;
    while((TextRenderer.MeasureText(ts, titleFont)).Width > mailList.Width + (TextRenderer.MeasureText("...", titleFont)).Width)
{
ts = ts.SubString(0,ts.Length-1);
}
return ts + "..."
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...