Silverlight:如何预测字符串大小?

时间:2010-11-07 13:41:47

标签: silverlight windows-phone-7

我面临很多Silverlight处理布局问题的方法。主要是,在实际绘制字符串之前,我找不到预测字符串占用大小的方法。在iPhone上,我们有一些非常简单的方法,允许我们根据字体大小,自动换行选项和可用的宽度和/或高度来确定字符串在屏幕上占用的大小。但是使用Silverlight,我找不到在我的应用程序中获得一致结果的方法。

我目前正在使用TextBlock实例的ActuelHeight和ActualWidth,但它会给我随机结果。例如,我使用以下代码......

TextBlock proto = new TextBlock();

proto.Width = 456;
proto.TextWrapping = TextWrapping.Wrap;
proto.Text = "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.";
double h = proto.ActualHeight;

... h设置为66像素!正如你自己可以猜到的那样,这样一个长文本无法适应456像素宽和66像素高的矩形。当我在画布中添加文本块时,确认它的大小为{456; 66}并测试应用程序:文本根本不适合文本块!

有人可以解释问题所在,并指出我采用一致(可信)的方式来衡量字符串大小吗?

先谢谢,

埃里克。

5 个答案:

答案 0 :(得分:12)

您可以通过调用TextBlock方法让Measure自行衡量(不显示):

textBlock.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity));
var width = textBlock.DesiredSize.Width;
var height = textBlock.DesiredSize.Height;

当然,它可能没有无限的宽度和高度,因此根据您的使用情况,您可能更愿意让您的根元素进行自我测量,然后测量所有子项(包括TextBlock)。

答案 1 :(得分:3)

尽可能尝试创建一个设计,您无需知道文本块的物理大小。使用滚动设计和动态调整大小以避免需要知道这一点。

但是,如果你真的必须知道这一点,你可以从桌面尝试这个技巧(无法使用MeasureText - 抱歉不支持Silverlight)。将文本块添加到UI但是在可见区域之外或在另一个控件之后。然后,您可以获得实际渲染的大小。

答案 2 :(得分:1)

TextBlock在实际显示之前不会调整大小...

对于其他人,我认为这是一个设计问题。在XAML环境中,您不必经常知道/设置像素值。

答案 3 :(得分:1)

感谢您的帮助,实际上我的第一种方法正在运作!但是我忘记在检索ActualHeight之前设置fontSize - 它一旦被添加到可视树中就由父级自动设置!所以66像素实际上是我的文本块的正确高度,文本块默认使用小字体。一旦添加到可视树中,文本块的字体大小就会变大,导致剪切。

再次感谢您的帮助!

答案 4 :(得分:-2)

我的解决方案是使用3个或更多TextBlocks:

string[] dataSeparator = new string[] { "\n" };
string[] data;
data = longString.Split(dataSeparator, StringSplitOptions.None);
TB1.Text = string.Empty;
TB2.Text = string.Empty;
TB3.Text = string.Empty;
int length = data.Length / 3;
for (int i = 0; i < length; i++)
{
    TB1.Text += data[i] + "\n";
}
for (int i = length; i < length * 2; i++)
{
    TB2.Text += data[i] + "\n";
}
for (int i = length * 2; i < data.Length; i++)
{
    TB3.Text += data[i] + "\n";
}