Wpf 显示非矩形文本块

Wpf 显示非矩形文本块,wpf,silverlight,xaml,wpf-controls,textblock,Wpf,Silverlight,Xaml,Wpf Controls,Textblock,我想在三角形区域显示文本。但是我不知道如何改变文本块的形状,使文本显示在三角形区域而不是规则的矩形区域 以下是我的UserControl的简化代码: <Grid > <Image Height="100" Width="100" /> <!-- Some triangular image --> <TextBlock Height="100" Width="100" Text="This text should fill up the

我想在三角形区域显示文本。但是我不知道如何改变文本块的形状,使文本显示在三角形区域而不是规则的矩形区域

以下是我的UserControl的简化代码:

<Grid >
    <Image Height="100" Width="100" />   <!-- Some triangular image -->
    <TextBlock Height="100" Width="100" Text="This text should fill up the triangualr image area"/>
</Grid>

您需要覆盖文本框的模板

我建议您获取的副本,从中提取TextBox的模板,并修改它以满足您的需要


如果您无法获得Blend,我建议使用它,这是一种WPF工具,显示大多数WPF控件的默认模板,这是一种过激的解决方案,但如果遵循类似的方法,内部网格的内容将是三角形排列:

 <Grid>
   <Image Height="200" Width="200" />
   <Grid Width="200">
        <Grid.RowDefinitions>
             <RowDefinition />
             <RowDefinition />
             <RowDefinition />
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
             <ColumnDefinition />
             <ColumnDefinition />
             <ColumnDefinition />
             <ColumnDefinition />
             <ColumnDefinition />
        </Grid.ColumnDefinitions>

        <TextBlock Grid.Row="0" Grid.Column="2" Grid.ColumnSpan="1" Text="Line 1" HorizontalAlignment="Center"/>
        <TextBlock Grid.Row="1" Grid.Column="1" Grid.ColumnSpan="3" Text="This is Line 2." HorizontalAlignment="Center"/>
        <TextBlock Grid.Row="2" Grid.Column="0" Grid.ColumnSpan="5" Text="This is Line 3. Wud be longest." HorizontalAlignment="Center"/>
   </Grid>
 </Grid>

为供参考,网格的构造如下:


设置背景三角形图像&我想这就足够了。

只需覆盖文本框的模板,如下所示

<ControlTemplate TargetType="Textbox">
    <Path ... define your triangle here>               
</ControlTemplate> 

然后将文本框上的enter属性设置为true。同时对齐控制杆。和垂直。阿尔格。这样,它就集中在三角形的中间。确保文本框背景透明,以免覆盖三角形边界

另外,如果不想超出范围,请将内容演示器放在一个视图框中


您还可以查看clip属性。

我想您错过了OP希望在三角形区域中显示文本而不是真正在三角形文本框中显示文本的内容。谢谢您的解决方案。我已经在我的机器上混合了。但我不知道如何将模板设置为三角形区域,以便文本显示在那里。你能给我一份xaml溶液的样品吗?我也会尝试自己并肩完成。我在WPF中遇到了这个问题,但我想在Silverlight中也会遇到类似的问题\解决方案。如果我错了,请纠正我的错误,这比许多人通常意识到的解决方案差别很大的情况要多。在您的问题中,始终非常清楚您是否需要WPF、Silverlight或两者的解决方案。好的。听起来不错。我认为这可能会引起两个论坛的兴趣,因为这是一个共同的问题,但如果你认为这是一个问题,那么下次我宁愿小心。谢谢,这两个标签都很有意思,包括这两个标签也没有坏处,但是如果问题清楚,解决方案需要什么样的实际平台,它会有所帮助。整个单词应该保持在同一行吗?如果第一个单词是“AntidiseStablementArianism”,我们会遇到问题,对吗?实际上,为了简单起见,我在我的问题中在TextBlock中显式设置了Text属性。实际上,我是通过绑定来设置文本的。因此,按照文本宽度将文本分成3个不同的部分将是复杂的。@苏维克:无论您最终使用什么解决方案,都将是复杂的。@Anthony-使用模板可能是一个更干净的解决方案(因为您不必做算术运算来计算文本宽度)。即使在两个复杂的解决方案中,你也可以有一个较复杂的解决方案和一个较复杂的解决方案。我想找出比较简单和干净的一个。@Souvik:你认为你不需要测量文本宽度和做算术就可以做到这一点吗?如果你能做到这一点,那就太好了,但你应该做好准备,因为我认为你不会有太多选择。