根据控件的宽度决定要显示的字符串
本文关键字:显示 字符串 决定 控件 | 更新日期: 2023-09-27 18:01:58
我在SplitterPanel中有一个列表框。我已经重写了它的MeasureItem()和DrawItem()方法。
我想做的是,取决于Listbox。宽度,返回整个字符串或它的缩短版本,如"Dance toni…"。
我浏览了SO,发现了两个与我的问题有关的问题。其中一个问题是测量文本的宽度,这是我在DrawItem()中使用e.Graphics.MeasureString()。
Summary -我有一个列表框的宽度,和一个字符串的宽度,以像素为单位。如果字符串比列表框的宽度短,我想要完整地显示字符串。然而,如果它更长,我想返回一个版本,如"Hello每…",将适合在列表框的宽度内。
到目前为止,我有:
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?
}
}
我敢肯定这只是简单的数学,但我还是算不出来。
我认为你需要检查它是否合适,如果是,返回整个字符串,否则修改你的代码运行一个循环,不断测量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;
}
[edit: too many to name]
下面是我要使用的伪代码…
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;
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 + "..."