您如何在Silverlight中证明文本的合理性?

您如何在Silverlight中证明文本的合理性?,silverlight,text,layout,Silverlight,Text,Layout,有人对Silverlight 2中的只读文本(呈现为TextBlock)有什么建议吗?WPF通过TextAlignment枚举支持文本对齐: public enum TextAlignment { Left, Right, Center, Justify // <--- Missing from Silverlight :( } 非常感谢您的任何想法或建议。如果这些想法或建议不符合您的需要,您应该编写一个扩展器或转换器并绑定到该扩展器或转换器,而不是使用其

有人对Silverlight 2中的只读文本(呈现为
TextBlock
)有什么建议吗?WPF通过
TextAlignment
枚举支持文本对齐:

public enum TextAlignment
{
    Left,
    Right,
    Center,
    Justify // <--- Missing from Silverlight :(
}

非常感谢您的任何想法或建议。

如果这些想法或建议不符合您的需要,您应该编写一个扩展器或转换器并绑定到该扩展器或转换器,而不是使用其中一个枚举。

在我的脑海中,我可以想出两种不太容易的方法来做到这一点。一个相当跛脚;在单词之间添加空格。另一种是以某种方式解析文本,使每个单词都是它自己的文本块,然后可以使用网格左对齐一行的第一个单词,右对齐一行的最后一个单词,然后使用堆栈面板或类似工具在中心单元格中隔开其他块


确定哪些单词是一行的开始和结束将涉及测量每个块的渲染大小,并确定它是否适合。这并不简单,但应该能奏效。

我在博客上找到了一篇关于这一点的文章-。 其思想是将文本划分为单独的行,然后对每行应用ScaleTransform,将文本从左(renderTransferMorigin=0,0)缩放到右(Scale.X=1.02)。
但是这种方法只适用于小块文本,如果文本框大小发生变化,可能会停止使用。

显然,唯一的解决方案是将文本行拆分为单词,并在整个列中布局单词(正如Jeff Yates所建议的)。第一件事是使用网格容器验证想法:

<Grid Name="grid1">
<Grid.ColumnDefinitions>
    <ColumnDefinition Width="Auto"/>
    <ColumnDefinition Width="*"/>
    <ColumnDefinition Width="Auto"/>
    <ColumnDefinition Width="*"/>
    <ColumnDefinition Width="Auto"/>
    <ColumnDefinition Width="*"/>
    <ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<TextBlock HorizontalAlignment="Left" Text="This" Grid.Column="0" />
<TextBlock HorizontalAlignment="Center" Text="is" Grid.Column="2" />
<TextBlock HorizontalAlignment="Center" Text="someprettylongpiece" Grid.Column="4" />
<TextBlock HorizontalAlignment="Right" Text="text" Grid.Column="6" />
</Grid>

下一步是创建执行文本块布局而不处理网格的自定义面板:

<JustifiedPanel>
    <TextBlock Text="This"/>
    <TextBlock Text="is"/>
    <TextBlock Text="a"/>
    <TextBlock Text="justified"/>
    <TextBlock Text="line"/>
    <TextBlock Text="of"/>
    <TextBlock Text="text"/>
    <TextBlock Text="that"/>
    <TextBlock Text="demonstrates"/>
    <TextBlock Text="feasibility"/>
</JustifiedPanel>

(示例源代码在上提供) 最后,我将创建justizedTextBlock控件,它将文本拆分为单词并对其进行布局。这里最重要的是正确的RTL支持和正确的行分割。

现在您可以使用
,这将非常棒


如果您愿意,这是鲁迪·休恩(Rudy Huyn)的一首法国短裙:

不确定您指的是哪个枚举,但问题中给出的值是正确的。。根据Reflector,查看Blend和VS.NET中的属性值。你能详细说明一下吗?关于扩展器和转换器的想法,我不认为转换器会有什么帮助:S+1好问题。我自己也做过一些Silverlight,但是我没有做过任何主要的WPF,所以我不知道这些“缺失”的项目(我现在是WinForms的家伙)。从2.0开始,Silverlight中的文本格式已经失效。您甚至不能编写自己的文本布局代码,因为度量文本的唯一方法是创建一个TextBlock并度量它,但这并不能提供您所需的所有度量。希望Silverlight 3…如果你必须使用文本,你必须使用文本。没有必要向任何人证明这一点=o) 谢谢你的回答。。我也想到了你的第一种方法,但是第二种方法很新颖,你给了我一个可能使用自定义布局面板的想法谢谢,我在提问之前看到了那篇文章;作为一种方法,它感觉非常脆弱;但感谢您的关注:)好吧,让我们一起期待:当Silverlight 3在三月份面世时,证明自己是正确的。现在,比例变换似乎是“最简单”的方法。可惜我们在这里没有英文摘要;)如果你愿意,我可以翻译。我认为图像和截图足够清晰。
<JustifiedPanel>
    <TextBlock Text="This"/>
    <TextBlock Text="is"/>
    <TextBlock Text="a"/>
    <TextBlock Text="justified"/>
    <TextBlock Text="line"/>
    <TextBlock Text="of"/>
    <TextBlock Text="text"/>
    <TextBlock Text="that"/>
    <TextBlock Text="demonstrates"/>
    <TextBlock Text="feasibility"/>
</JustifiedPanel>