Почему заливка эллипса не применяется, когда свойство Stretch установлено внутри VisualBrush?

Я работаю над пользовательским элементом управления, и у меня есть 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 свойство установлено в Uniform вместо использования RadialGradientBrush Я создал, это как-то создает SolidColorBrush с использованием Stroke цвет. Тем не менее, когда я явно установить Width а также Height свойства Ellipse вместо использования Stretch собственность, я получаю градиент, который я ожидал.

Есть идеи, что здесь странного?

РЕДАКТИРОВАТЬ: я только что заметил, что поведение происходит, когда я заключаю Ellipse внутри ViewBox,

1 ответ

Решение

Я не уверен, что вы используете ViewBox в приведенном выше примере, но я думаю, что некоторое странное поведение, которое вы видите, является результатом не установки размера корневого элемента для вашего VisualBrush,

В документации для VisualBrush.Visualесть параграф, который упоминает размер (добавлен акцент):

Когда вы определяете новый Visual для VisualBrush и этот Visual представляет собой UIElement (например, панель или элемент управления), система макетов запускается на UIElement и его дочерних элементах, когда для свойства AutoLayoutContent установлено значение true. Однако корневой UIElement по существу изолирован от остальной части системы; стили, раскадровки и внешний макет, определяемые родителем, к которому применяется кисть, не могут проникнуть через эту границу. Следовательно, вы должны явно указать размер корневого UIElement, потому что его единственным родителем является VisualBrush и, следовательно, он не может автоматически изменять размер области, которая будет окрашена. Дополнительные сведения о макете в Windows Presentation Foundation (WPF) см. В разделе Макет.

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

Если я дам корневому элементу произвольный размер, на котором будет основываться макет <Grid Width="100" Height="100">...</grid> Я начинаю видеть обводку и заполняю цвета, отрисованные с относительными размерами.

Другие вопросы по тегам