Xamarin.Forms - 如何使用 Measure() 复制标签和尺寸?尝试自动调整字体大小。 (挠头!)

Xamarin.Forms - How to copy Label and size with Measure()? Trying to auto size font. (Head scratcher!)

有一个名为 Empirical Font Size 的很棒的 Xamarin.Forms 示例项目,它计算 Label 在其包含视图中的最大可能字体大小。它获取有问题的标签,使用 VisualElement.Measure() 根据其属性获取标签的一些大小请求,并将请求的大小与容器的大小进行比较,以查看标签是否适合该字体大小。它会重新计算,直到找到最合适的。它很好用,但我想修改它以做更多事情。

不幸的是,我在修改过程中遇到了一些棘手的障碍,我不确定它们是否更多地与 C# 或 Xamarin 相关。这是我想做的。

目标 #2 是我遇到问题的地方。 我找不到复制标签然后对临时副本执行大小计算的方法。这是我尝试过的方法以及每次尝试失败的原因。

要使其中任何一个起作用,我需要复制标签,立即对副本执行计算,并将生成的字体大小应用于原始标签。然后副本消失。噗!不幸的是,我所做的任何副本都会导致不同的计算,所以这就是我目前遇到的问题。

有人在别处提到,可能调整大小不起作用,因为新标签不是布局的一部分,因此无法调整大小,但他们没有解释,所以我不明白它们是什么到达。

要了解哪些有效,哪些无效,这里有一个小型 Xamarin 示例项目,其中包含 Empirical Font Size 项目的修改版本。这是一个简单的 A/B 测试。具有相同文本的两个标签由两个几乎相同的函数调整大小——一个使用原始标签,另一个尝试使用副本。它们应该填充提供的堆栈布局的上半部分和下半部分,但副本不起作用。我想帮助完成这项工作。

修改后的示例项目: https://drive.google.com/file/d/1mWxE3p6u53jkIdaIEFVFnkI7BC-kfske/view?usp=sharing

我想出了一个安全、简单的解决方法来解决这个问题,我称之为 'ghost sizing'。您可以创建一个不可见的 'ghost label' 并将其放入将调整标签大小的页面中。它是不可见的,所以它根本不会改变布局,但它仍然可以用于尺寸计算。您将要调整大小的标签的文本传递到 ghost 标签,将 ghost 标签调整为所需 space,并将返回的大小值应用于目标标签。

XAML:

<!--  for sizing other elements without breaking bindings  -->
<Label x:Name="ghostLabel" IsVisible="false" />

C#code-behind:

ghostLabel.Text = String.Copy(myLabel.Text);

...
double labelFontSize = ...// do font size calculations here using the ghostLabel object
...

myLabel.FontSize = labelFontSize;

如果你好奇的话,我已经为这个做了我自己的字体大小class。

Github repo

further ghost sizing notes