Как я могу применить GradientBrush к нескольким последовательным объектам в XAML? - PullRequest
2 голосов
/ 20 сентября 2009

У меня есть TextBlock и Линия, расположенные рядом друг с другом в их собственной эксклюзивной 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 отдельно от линии. Мне нужно найти способ применить градиент через TextBlock и линию за один проход - как если бы они были полностью одним и тем же объектом. В этом примере текст должен быть в основном синим, а строка - в основном оранжевым.

Ответы [ 2 ]

2 голосов
/ 22 сентября 2009

В 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>

Затем примените эту кисть к маске непрозрачности прямоугольника, например:

  <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>

Вы также можете превратить текст в путь, но потеряете возможность изменить текст, чем.

2 голосов
/ 22 сентября 2009

Ваша проблема в том, что текст не является вектором и поэтому не может быть объединен со строкой (любым способом, который я знаю).

Я считаю, что в Expression Blend можно преобразовать текст в векторный путь, а затем использовать его для создания обтравочного контура над градиентом. Или, используя векторный текстовый путь, как вы бы сделали с вашей линией, используйте цвет фона неограниченной высоты и прозрачную заливку для самого вектора.

Похоже, много проблем, чтобы пойти. Задумывались ли вы об использовании третьего цвета для объединения двух? Например, текстовый блок исчезает с синего на оранжевый, а затем на линии оранжевого цвета для фона. Вы могли бы получить подобный эффект за гораздо меньшие усилия.

...