Как я могу сделать «мягкой» линии в WPF (предположительно с помощью LinearGradientBrush)?

голоса
14

Я пытаюсь нарисовать линию с мягкими краями, независимо от наклона.

Вот код, который я до сих пор:

<Line   HorizontalAlignment=Stretch VerticalAlignment=Center
        Stretch=Uniform StrokeThickness=5 X1=0 Y1=0 X2=1 Y2=0>
    <Shape.Stroke>
        <LinearGradientBrush StartPoint=0,0 EndPoint=0,1>
            <GradientStop Color=Transparent Offset=0 />
            <GradientStop Color=Green Offset=0.5 />
            <GradientStop Color=Transparent Offset=1 />
        </LinearGradientBrush>
    </Shape.Stroke>
</Line>

Это имеет смысл для меня, так как линия находится в горизонтальном положении, а линейный градиент вертикальный, с краями, быть прозрачными и середина линии является твердым зеленой.

Результат приятно:
http://img15.imageshack.us/img15/4108/horizontalsoftline.png
Увеличенный так что вы можете увидеть градиент:
http://img225.imageshack.us/img225/5027/horizontalsoftlinezoomeb.png

Тем не менее, когда линия больше не по горизонтали, градиент не рассчитываются на основе ограничивающего прямоугольника линии, а не от геометрии самой линии. Результат наклонной линии , которая заштрихована вертикально, а не градиент, перпендикулярная линия:
http://img183.imageshack.us/img183/7250/slantedsoftline.png

Кто-нибудь знает, как WPF обрабатывает мягкие края? Я не могу найти что-нибудь на Google или MSDN, и я знаю, что есть способ сделать это somewhow ...

Задан 11/09/2009 в 20:24
источник пользователем
На других языках...                            


4 ответов

голоса
5

Ну, я не знаю, если это применимо к вашему сценарию, но вы можете просто повернуть горизонтальную линию, используя LayoutTransform и градиент будет в порядке.

<Line   HorizontalAlignment="Stretch" VerticalAlignment="Center"
    Stretch="Uniform" StrokeThickness="5" X1="0" Y1="0" X2="1" Y2="0">
<Shape.Stroke>
    <LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
        <GradientStop Color="Transparent" Offset="0" />
        <GradientStop Color="Green" Offset="0.5" />
        <GradientStop Color="Transparent" Offset="1" />
    </LinearGradientBrush>
</Shape.Stroke>
    <Line.LayoutTransform>
        <RotateTransform Angle="40"/>
    </Line.LayoutTransform>

Ответил 11/09/2009 в 21:17
источник пользователем

голоса
2

Попробуйте использовать форму вместо строки

<Path Data="M0,0 L25,25 z" Fill="#FFF4F4F5" StrokeThickness="5" Canvas.Left="122" Canvas.Top="58">
<Path.Stroke>
    <LinearGradientBrush EndPoint="1.135,0.994" StartPoint="-0.177,-0.077">
        <GradientStop Color="Black"/>
        <GradientStop Color="#FF68A8FF" Offset="1"/>
    </LinearGradientBrush>
</Path.Stroke>

Томер

Ответил 08/03/2011 в 10:21
источник пользователем

голоса
0

Вы можете установить MappingMode="Absolute"на своем «LinearGradientBrush». Тогда ваши начало кисти / конечные координаты не относительно ограничительной рамки. Конечно, вам придется грызть немного тригонометрии , чтобы получить правильные точки ...

https://docs.microsoft.com/en-us/dotnet/api/system.windows.media.gradientbrush.mappingmode?view=netframework-4.7.2#System_Windows_Media_GradientBrush_MappingMode

Ответил 19/09/2018 в 15:05
источник пользователем

голоса
0

Вы можете сложить много путей с увеличением толщины и уменьшения цветовых оттенков, используя один над другим.

Для всех путей , чтобы иметь такую же геометрию, вы должны использовать элемент привязки к Dataсобственности одного из них.

Скорее всего, какой-то код-за был бы полезен для создания контуров и цветовых градиентов динамически, если это необходимо.

Ответил 07/01/2014 в 13:50
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more