如何在Silverlight中调整文本对齐方式?

5

有人有关于如何在Silverlight 2中使只读文本(渲染到中)对齐的建议吗?WPF通过枚举支持文本对齐:

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

然而,Silverlight 2 仅支持以下功能:

public enum TextAlignment
{
    Center,
    Left,
    Right
}

非常感谢您的想法和建议。


+1 很好的问题。我自己也做了一些 Silverlight,但并没有做过任何重要的 WPF,所以对于其中的一些“缺失”项目我不清楚(目前我是一个 WinForms 的人)。 - Jeff Yates
自Silverlight 2.0起,文本格式化受到了限制。你甚至不能编写自己的文本布局代码,因为测量文本的唯一方法是创建一个TextBlock并测量它,但这并不会给你所有需要的指标。希望Silverlight 3能够... - U62
2
如果你必须使用文本,那就必须使用文本。不需要向任何人证明它。=o) - Echostorm
5个回答

1

脑海中,我可以想到两种不太容易的方法来解决这个问题。一种比较糟糕的方法是在单词之间添加空格。另一种方法是以某种方式解析文本,使每个单词都成为自己的文本块,然后使用网格将一行的第一个单词左对齐和最后一个单词右对齐,然后使用堆栈面板或类似物在中心单元中间间隔其他块。

确定哪些单词是一行的开头和结尾将涉及测量每个块的呈现大小并决定它是否适合。虽然不简单,但应该可以解决问题。


1
感谢您的回答..你的第一种方法也发生在我脑海中,然而第二种方法是新颖的想法,您给了我可能使用自定义布局面板的想法。 - PaulJ

0

谢谢,我在提问之前看过那篇帖子;但是那种方法感觉非常脆弱;不过还是谢谢你的回答 :) - PaulJ
希望在三月份推出 Silverlight 3 时,可以使用 align:justify。目前来看,缩放变换似乎是最简单的方法。 - texmex5

0

显然,唯一的解决方案是将文本行拆分为单词,并将单词布局在列中(正如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>

(示例源代码可在我的博客上找到) 最后,我将创建JustifiedTextBlock控件,它将把文本分割成单词并进行布局。这里的非平凡事情是正确的RTL支持和正确的行拆分。


0

现在你可以使用 <RichTextBox>,效果非常好。

让我们看看如何在 Windows Phone 上对齐文本。

TextBlock?

TextBlock 元素确实有 TextAlignment 属性,但只允许三个值:Left(左对齐)、Center(居中)和 Right(右对齐)。

从视觉上看,这是:

文本对齐方式:左对齐,居中,右对齐

然而,我们想通过调整空格的宽度将文本同时左对齐和右对齐,但是使用TextBlock控件无法实现。

解决方案:RichTextBlock

自从Mango和转换到Silverlight 4以来,我们现在可以使用一个新元素叫做RichTextBlock。这个元素就像TextBlock一样显示文本,但是它有更多的格式化可能性,如果我们必须进行比较,RichTextBlock就像Word对于Notepad一样。

如果我们查看RichTextBlock的TextAlignment属性,我们可以看到它具有两端对齐(Justify)的对齐方式。

多亏了这个元素,现在我们可以显示对齐的文本。

<RichTextBox TextAlignment="Justify">

<Paragraph>

<Run Text="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec non lectus urna, id commodo metus. Integer id metus augue, non facilisis lectus. Fusce massa purus, varius ut auctor ac, sagittis a massa. Sed sed justo velit, at molestie orci. Nullam malesuada nibh et massa hendrerit mattis. Nunc id laoreet nisl. Sed vulputate lobortis mi nec mollis."/>

</Paragraph>
</RichTextBox>

这里是渲染结果:

混合提示

与TextBlock不同,要修改RichTextBlock的文本,您需要右键单击元素并选择“编辑文本”

为了更快地操作,您可以使用 F2 键,它允许您编辑任何文本类型控件的文本!

source


1
很遗憾,我们无法在这里得到一些英文摘要 ;) - Andrew Barber
如果您需要,我可以翻译它。我认为图像和截图已经足够清晰了。 - aloisdg

-2
如果这些不符合您的需求,您应该编写一个扩展程序或转换器,并绑定到它,而不是使用其中一个枚举。

不确定您指的是哪个枚举,但根据反射器、在Blend和VS.NET中查看属性值,问题中发布的值是正确的。您能详细说明一下吗?至于Extender和Converter的想法,我不明白转换器如何会有帮助:S - PaulJ

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接