- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有自己定制的面板。我用它来显示文本。但有时该文本太长并换行到下一行。有什么方法可以自动调整面板大小以显示所有文本吗?
我正在使用 C# 和 Visual Studio 2008 以及紧凑型框架。
这是我要调整大小的代码:
(注:HintBox是我自己的类,继承自panel。所以我可以根据需要修改。)
public void DataItemClicked(ShipmentData shipmentData)
{
// Setup the HintBox
if (_dataItemHintBox == null)
_dataItemHintBox = HintBox.GetHintBox(ShipmentForm.AsAnObjectThatCanOwn(),
_dataShipSelectedPoint,
new Size(135, 50), shipmentData.LongDesc,
Color.LightSteelBlue);
_dataItemHintBox.Location = new Point(_dataShipSelectedPoint.X - 100,
_dataShipSelectedPoint.Y - 50);
_dataItemHintBox.MessageText = shipmentData.LongDesc;
// It would be nice to set the size right here
_dataItemHintBox.Size = _dataItemHintBox.MethodToResizeTheHeightToShowTheWholeString()
_dataItemHintBox.Show();
}
我将向 Will Marcouiller 给出答案,因为他的代码示例最接近我的需要(并且看起来可以正常工作)。然而,这就是我想我会使用的:
public static class CFMeasureString
{
private struct Rect
{
public readonly int Left, Top, Right, Bottom;
public Rect(Rectangle r)
{
this.Left = r.Left;
this.Top = r.Top;
this.Bottom = r.Bottom;
this.Right = r.Right;
}
}
[DllImport("coredll.dll")]
static extern int DrawText(IntPtr hdc, string lpStr, int nCount,
ref Rect lpRect, int wFormat);
private const int DT_CALCRECT = 0x00000400;
private const int DT_WORDBREAK = 0x00000010;
private const int DT_EDITCONTROL = 0x00002000;
static public Size MeasureString(this Graphics gr, string text, Rectangle rect,
bool textboxControl)
{
Rect bounds = new Rect(rect);
IntPtr hdc = gr.GetHdc();
int flags = DT_CALCRECT | DT_WORDBREAK;
if (textboxControl) flags |= DT_EDITCONTROL;
DrawText(hdc, text, text.Length, ref bounds, flags);
gr.ReleaseHdc(hdc);
return new Size(bounds.Right - bounds.Left, bounds.Bottom - bounds.Top +
(textboxControl ? 6 : 0));
}
}
这使用操作系统级别的调用来绘制文本。通过 P-Invoking 它我可以获得我需要的功能(多行换行)。请注意,此方法不包括任何边距。只是文本实际占用的空间。
这段代码不是我写的。我从http://www.mobilepractices.com/2007/12/multi-line-graphicsmeasurestring.html得到的.那篇博文有我的确切问题和这个修复。 (虽然我确实做了一个小调整,使它成为一种扩展方法。)
最佳答案
您可以使用 Graphics.MeasureString()
方法。
如果您需要在面板上分配文本的代码示例,我或许可以提供使用 MeasureString()
方法的代码示例。
我无法知道 Graphics.MeasureString()
方法是否是 Compact Framework 的一部分,因为我链接的页面上没有说明。
编辑#1
Here's a link我在这里回答了另一个与文本大小相关的问题,同时我正在寻找为您编写示例。 =)
编辑#2
Here's another link related你的问题。 (接下来编辑的是示例代码。=P)
编辑#3
public void DataItemClicked(ShipmentData shipmentData) {
// Setup the HintBox
if (_dataItemHintBox == null)
_dataItemHintBox = HintBox.GetHintBox(ShipmentForm.AsAnObjectThatCanOwn(),
_dataShipSelectedPoint,
new Size(135, 50), shipmentData.LongDesc,
Color.LightSteelBlue);
// Beginning to measure the size of the string shipmentData.LongDesc here.
// Assuming that the initial font size should be 30pt.
Single fontSize = 30.0F;
Font f = new Font("fontFamily", fontSize, FontStyle.Regular);
// The Panel.CreateGraphics method provides the instance of Graphics object
// that shall be used to compare the string size against.
using (Graphics g = _dataItemHintBox.CreateGraphics()) {
while (g.MeasureString(shipmentData.LongDesc, f).Width > _dataItemHintBox.Size.Width - 5) {
--fontSize;
f = new Font("fontFamily", fontSize, FontStyle.Regular);
}
}
// Font property inherited from Panel control.
_dataItemHintBox.Font = f;
// End of font resizing to fit the HintBox panel.
_dataItemHintBox.Location = new Point(_dataShipSelectedPoint.X - 100,
_dataShipSelectedPoint.Y - 50);
_dataItemHintBox.MessageText = shipmentData.LongDesc;
// It would be nice to set the size right here
_dataItemHintBox.Size = _dataItemHintBox.MethodToResizeTheHeightToShowTheWholeString()
_dataItemHintBox.Show();
}
免责声明:此代码未经测试,超出我的想象。一些更改可能是强制性的,以便您对其进行测试。这提供了实现您似乎想要完成的目标的指南。可能有更好的方法来做到这一点,但我知道这个有效。好吧,正如您在我的其他答案中看到的那样,该算法有效。
代替行:
SizeF fontSize = 30.0F;
您还可以执行以下操作:
var fontSize = _dataItemHintBox.Font.Size;
Why is this?
因为 Font.Size
属性是只读。因此,您需要创建 System.Drawing.Font
的新实例每次 Font.Size
都会改变时的类。
在你的比较中,而不是有这条线:
while (g.MeasureString(shipmentData.LongDesc, f)...)
你还可以:
while (g.MeasureString(shipmentData.LongDesc, _dataItemHintBox.Font)...)
这将消除对第二个 Font
类实例的需求,即 f。
请随时发布反馈,因为我可以根据收到的反馈更改我的示例以适应您的实际情况,以便更好地帮助您。 =)
希望对您有所帮助! =)
关于c# - 查找面板中文本的高度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3024943/
我在服务器上创建了一个 JSONP 函数并像这样返回一个 UTF-8 编码的 json 对象 applyLocalization({"Name":"%E5%90%8D%E5%89%8D","Age":
我正在开发一个应用程序,在该应用程序中我从API获取数据,并且正在获取这样的汉字 “u9c9cu82b1u548cu7231” 鲜花和爱 如何转换? 最佳答案 您的字符串采用转义的unicode格式。
好吧,我已经有了这个正则表达式,用于我网站上允许的名称。但是,我还希望添加名称可能使用的其他字母。有人有好的 regex 或知道如何使它更完整吗?我已经搜索了一段时间,但找不到适合我需要的内容。 这是
好吧,我已经有了这个正则表达式,用于我网站上允许的名称。但是,我还希望添加名称可能使用的其他字母。有人有好的 regex 或知道如何使它更完整吗?我已经搜索了一段时间,但找不到适合我需要的内容。 这是
本文实例讲述了Yii框架多语言站点配置方法。分享给大家供大家参考,具体如下: 这里假设我们要建立 中文/英文 切换的站点 1. 设置全局默认的语言 文件添加代码:protected/confi
我想知道如何设置编码参数,以便当我下载文本时,它“看起来”与我在网络浏览器中的页面源代码中看到的一样,例如: readLines("http://www.baidu.com/s?wd=r+projec
我计划开发一个 web 应用程序,它将使用一种新颖的方式来帮助人们学习汉字并记住它们的含义。 由于我不想/不能花费数年时间手动翻译所有中文字符,我想知道是否有(最好是开源的)数据库(任何形式)提供此功
我知道我的问题已经在这里有了解决方案。但我只想具体说明我的情况。我有一个 json 对象,其中包含非英语字符。 例如。 {“my_chinise_name”:“吉米”}。 该对象将通过 javascr
我有一个设置,其中邮件服务器(postfix)收到的电子邮件被处理,生成的电子邮件的正文(html或纯文本)和附件被解析为单独的文件并保存,为此我使用javax mail api。 当电子邮件正文为中
我的 settings.py 看起来像这样: LANGUAGES = ( ('en', _('English')), ('fr', _('French')), #Simplif
在我的图表中,x轴需要显示中文,y轴需要显示英文,但x轴显示困惑的代码。有人可以帮助我吗? self.chart.createDefaultAxes() axis_x, axis_y = self.c
使用Python3和BeautifulSoup v4 url='http://www.eurobasket2015.org/en/compID_qMRZdYCZI6EoANOrUf9le2.seaso
我的开发应用程序名称为中文。今天我从 CoreData 收到错误: CoreData: warning: Unable to load class named '゚ᆪンレ.' for enti
我正在用 java 编写一个 rss feed 解析器,在解析包含阿拉伯文/中文/日文字符的 feed 时遇到了问题。 Example feed 当我打印它们时,我只是得到一组问号“?????? ??
在我的一个Python程序(python 2.7)中,我需要处理一些汉字: 我有一个文件A.txt,它有两列:“name”和“score”,“name”列可以取一些中文字符串,score是一个1 到
我正在学习使用 eclipse 和 ADT 插件在 Android 上开发应用。 根据android SDK 文档中的这篇文章http://androidappdocs.appspot.com/res
我有这样的中文文字:“回家” - 好像是英文的“house”。 我去 google.com,在搜索中输入“回家”并得到这样的 url: http://www.google.ru/... q=%E5%9
我正在为我的应用程序添加中文支持。 我有这条线可以对英语和其他语言进行排序 NSSortDescriptor *sortByItem = [NSSortDescriptor sortDesc
我读日语,想尝试处理一些日语文本。我使用 Python 3 尝试了这个: for i in range(1,65535): print(chr(i), end='') 然后 Python 给了
我想将文本框值翻译成特定语言,如西类牙语、中文、德语等,它们都在下面的下拉列表中,我想在标签中显示文本框翻译值,但不在标签中显示翻译值。 English J
我是一名优秀的程序员,十分优秀!