1

私はカスタム コントロールに取り組んでおり、次のようなプロパティを持っVisualBrushています。Visual

<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を設定すると、どういうわけか色を使用してが作成されます。ただし、プロパティを使用する代わりにとのプロパティを明示的に設定すると、期待どおりのグラデーションが得られます。UniformRadialGradientBrushSolidColorBrushStrokeWidthHeightEllipseStretch

ここで奇妙なことが起こっているという考えはありますか?

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 に答える