2

我有一个 TextBlock 和一个 Line 在他们自己独有的 StackPanel 中并排放置。

我需要将我的 LinearGradientBrush 分布在两个对象上,而不是单独对它们进行着色。

我的项目目前看起来像这样:

http://img188.imageshack.us/img188/1268/seperategradients.png

<StackPanel Orientation="Horizontal">

    <TextBlock VerticalAlignment="Bottom">
        SomeTextContent
        <TextBlock.Foreground>
            <LinearGradientBrush StartPoint="0,0" EndPoint="1,0">
                <GradientStop Offset="0" Color="Blue" />
                <GradientStop Offset="1" Color="Orange" />
            </LinearGradientBrush>
        </TextBlock.Foreground>
    </TextBlock>

    <Line VerticalAlignment="Bottom" X2="100">
        <Line.Stroke>
            <LinearGradientBrush StartPoint="0,0" EndPoint="1,0">
                <GradientStop Offset="0" Color="Blue" />
                <GradientStop Offset="1" Color="Orange" />
            </LinearGradientBrush>
        </Line.Stroke>
    </Line>

</StackPanel>

如图所示,渐变应用到 TextBlock 与 Line 分开。我需要找到一种方法来一次通过 TextBlock 和 Line 应用渐变 - 就好像它们完全是同一个对象一样。在此示例中,文本应主要为蓝色,而行应主要为橙色。

4

2 回答 2

2

您的问题是 text 不是向量,因此不能与行组合(我知道的任何方式)。

我相信可以在 Expression Blend 中将文本更改为矢量路径,然后使用它在渐变上创建剪切路径。或者,像使用线条一样使用文本矢量路径,在矢量本身上使用背景颜色不受限制的高度边框和透明填充。

去那里似乎很麻烦。您是否考虑过使用第三种颜色来合并两者?例如,文本块从蓝色渐变为橙色,然后在橙色线上渐变为背景颜色。您可能会以更少的努力获得类似的效果。

于 2009-09-22T10:37:00.070 回答
2

在 WPF 中,您可以使用 Visual Brush。

将画笔资源添加到您的窗口或控件资源:

<Window.Resources>      
  <VisualBrush x:Key="stackPanel">
    <VisualBrush.Visual>
      <StackPanel Orientation="Horizontal">  
        <TextBlock VerticalAlignment="Bottom"> 
          SomeTextContent        
        </TextBlock>   
        <Line VerticalAlignment="Bottom" X2="100" Stroke="black"/>     
      </StackPanel>
    </VisualBrush.Visual>
  </VisualBrush>
</Window.Resources>

接下来,将该笔刷应用于矩形的 opacitymask,例如:

  <Rectangle OpacityMask="{DynamicResource stackPanel}">
    <Rectangle.Fill>
      <LinearGradientBrush EndPoint="1.0,0.5" StartPoint="0,0.5">
        <GradientStop Color="Blue" Offset="0"/>
        <GradientStop Color="Orange" Offset="1"/>
      </LinearGradientBrush>
     </Rectangle.Fill>
  </Rectangle>

您也可以将文本转换为路径,但您将失去更改文本的能力。

于 2009-09-22T10:57:08.303 回答