1

我正在开发一个自定义控件,并且我有一个这样VisualBrushVisual属性:

<VisualBrush.Visual>
    <Grid>
        <Ellipse Stretch="Uniform" Stroke="OrangeRed" StrokeThickness="1">
            <Ellipse.Fill>
                <RadialGradientBrush GradientOrigin="0.5,0.5">
                    <GradientStop Color="Yellow" Offset="0" />
                    <GradientStop Color="Orange" Offset="1" />
                </RadialGradientBrush>
            </Ellipse.Fill>
        </Ellipse>
        <Ellipse  Stretch="Uniform">
            <Ellipse.Fill>
                <RadialGradientBrush GradientOrigin="0.5, 0.05" RadiusX=".7" RadiusY=".5" >
                    <GradientStop Color="White" Offset=".10" />
                    <GradientStop Color="Transparent" Offset="1" />
                </RadialGradientBrush>
            </Ellipse.Fill>
        </Ellipse>
    </Grid>
</VisualBrush.Visual>

Stretch属性设置为Uniform而不是使用RadialGradientBrush我创建的时,它会以某种方式SolidColorBrush使用Stroke颜色创建一个。但是,当我明确设置WidthHeight的属性Ellipse而不是使用该Stretch属性时,我得到了我期望的渐变。

有什么奇怪的想法吗?

Ellipse编辑:我刚刚观察到当我将ViewBox.

4

1 回答 1

2

我不确定您ViewBox在上面的示例中使用的是什么,但我认为您看到的一些奇怪行为是由于没有为您的VisualBrush.

在 的文档VisualBrush.Visual,有一段提到了尺寸(增加了重点):

当您为 VisualBrush 定义新的 Visual 并且该 Visual 是 UIElement(例如面板或控件)时,当 AutoLayoutContent 属性设置为 true 时,布局系统将在 UIElement 及其子元素上运行。但是,根 UIElement 本质上是与系统的其余部分隔离的;由应用画笔的父级指定的样式、故事板和外部布局不能渗透到此边界。因此,您应该明确指定根 UIElement 的大小,因为它的唯一父级是 VisualBrush,因此它不能自动调整自身大小以适应正在绘制的区域。有关 Windows Presentation Foundation (WPF) 中的布局的详细信息,请参阅布局。

如果我在上面运行你的代码,我的椭圆完全被笔触颜色填充,大概是因为布局是用椭圆的最小值计算的,所以笔触足够大,可以覆盖椭圆的内容/填充(然后放大到填充视口,因此看起来笔触是填充颜色)。

如果我给根元素一些任意大小作为布局的基础,<Grid Width="100" Height="100">...</grid>我开始看到笔触和填充颜色,以相对大小呈现。

于 2013-07-28T12:08:17.397 回答