C#/WPF 计算字串的真实长度,调整控件的宽度
2016-06-23 11:18
405 查看
下面函数是经常用到的计算字串长度的方法:
private double MeasureTextWidth(String str, string fontName, double fontsize, double width)
{
double width = -1;
try
{
System.Drawing.Graphics graphics = System.Drawing.Graphics.FromHwnd(m_hWnd);
graphics.PageUnit = System.Drawing.GraphicsUnit.Point;
System.Drawing.Font font = new System.Drawing.Font(fontName, (float)fontsize);
System.Drawing.SizeF size = graphics.MeasureString(str, font);
width = size.width;
font.Dispose();
graphics.Dispose();
}
catch (System.Exception e)
{
}
return width;
}
但是事实上,Graphics.MeasureString并不可靠,在不同的SKU下得到的结果会不同,原因不明,可能跟显卡驱动也会有关系。今天尝试新的方法经测试有效,贡献出来:
private double MeasureTextWidth(string text, double fontSize, string fontFamily)
{
FormattedText formattedText = new FormattedText(
text,
System.Globalization.CultureInfo.InvariantCulture,
FlowDirection.LeftToRight,
new Typeface(fontFamily.ToString()),
fontSize,
Brushes.Black
);
return formattedText.WidthIncludingTrailingWhitespace;
}
另,附送枚举已安装字体的方法:
System.Drawing.FontFamily[] fontFamilies;
InstalledFontCollection installedFontCollection = new InstalledFontCollection();
fontFamilies = installedFontCollection.Families;
int count = fontFamilies.Length;
log("fontFamilies.Length=" + fontFamilies.Length);
for (int i = 0; i < count; i++)
{
fontName = fontFamilies[i].Name;
log("fontName: " + fontName);
}
参考自:http://zwkufo.blog.163.com/blog/static/258825120116663748213/
private double MeasureTextWidth(String str, string fontName, double fontsize, double width)
{
double width = -1;
try
{
System.Drawing.Graphics graphics = System.Drawing.Graphics.FromHwnd(m_hWnd);
graphics.PageUnit = System.Drawing.GraphicsUnit.Point;
System.Drawing.Font font = new System.Drawing.Font(fontName, (float)fontsize);
System.Drawing.SizeF size = graphics.MeasureString(str, font);
width = size.width;
font.Dispose();
graphics.Dispose();
}
catch (System.Exception e)
{
}
return width;
}
但是事实上,Graphics.MeasureString并不可靠,在不同的SKU下得到的结果会不同,原因不明,可能跟显卡驱动也会有关系。今天尝试新的方法经测试有效,贡献出来:
private double MeasureTextWidth(string text, double fontSize, string fontFamily)
{
FormattedText formattedText = new FormattedText(
text,
System.Globalization.CultureInfo.InvariantCulture,
FlowDirection.LeftToRight,
new Typeface(fontFamily.ToString()),
fontSize,
Brushes.Black
);
return formattedText.WidthIncludingTrailingWhitespace;
}
另,附送枚举已安装字体的方法:
System.Drawing.FontFamily[] fontFamilies;
InstalledFontCollection installedFontCollection = new InstalledFontCollection();
fontFamilies = installedFontCollection.Families;
int count = fontFamilies.Length;
log("fontFamilies.Length=" + fontFamilies.Length);
for (int i = 0; i < count; i++)
{
fontName = fontFamilies[i].Name;
log("fontName: " + fontName);
}
参考自:http://zwkufo.blog.163.com/blog/static/258825120116663748213/
相关文章推荐
- C# list 去重
- C# list 筛选FindAll,根据参数过滤
- C#项目中常用到的设计模式
- C# 静态类 考考你
- C#ArrayList
- 【C#】第3章补充(二)如何将图形作为对象
- C#中System.Func<>与System.Action<>的区别
- C#的标准容器类
- 在C#项目中如何添加“Web引用”?
- C#问题
- c# API
- c#服务器管理程序
- C#实现通过模板自动创建Word文档的方法
- C# 捕获关机事件方法
- C#制作、打包、签名、发布Activex全过程
- C#接口的作用
- c# 发送GET 和 POST请求
- c# 序列化和反序列化
- C# dataTable的linq联合查询,插入到新的dataTable中
- 【C#】关于文件的写入与读取