wpf跨越多个元素的渐变画笔

时间:2013-02-13 17:27:49

标签: wpf background gradient radial-gradients

假设有一个由具有任意嵌套的其他元素组成的不规则形状的元素:

<Window.Resources>
  <RadialGradientBrush x:Key="brush">
    <GradientStop Color="Black" Offset="0" />
    <GradientStop Color="White" Offset="1" />
  </RadialGradientBrush>
</Window.Resources>

<StackPanel Name="element">
  <StackPanel.Effect>
    <DropShadowEffect ShadowDepth="0" BlurRadius="10" />
  </StackPanel.Effect>
  <Rectangle Name="child1" Height="100" Margin="10" Stroke="Black" Fill="{StaticResource brush}" />
  <Grid>
    <Rectangle Name="child2" Height="100" Margin="10" Stroke="Black" Fill="{StaticResource brush}" />
  </Grid>
</StackPanel>

所有部分都是互动的(即孩子可以是真正的控制)。

如何填充具有单个径向渐变的子项背景,这些渐变跨越所有子项(看起来好像它的大小为element)。

更新:StackPanel有一个阴影应该围绕儿童绘制。

bad good

一种可能的解决方案是使用适当的转换生成Radius和Origin / Center绑定到elementchild属性的渐变,但这种方法相当复杂且昂贵。

1 个答案:

答案 0 :(得分:0)

最后,我使用转换渐变路径,除了绑定和转换器之外,我通过在子元素的Transformation中创建背景ArrangeOverride并通过依赖属性公开它来优雅地解决它。 实际RadialGradientBrush通过搜索匹配类型的祖先将其Transform绑定到BackgroundTransform

这假设可以修改/包装子类,这在我的情况下是正确的。它可以通过附加属性和更多工作变得更加灵活。

实际代码位于this gist