Wie kann ich eine „weiche“ Linie in WPF ziehen (vermutlich eine LinearGradientBrush verwenden)?

StackOverflow https://stackoverflow.com/questions/1412833

Frage

Ich versuche, eine Linie mit weichen Kanten zu zeichnen, und zwar unabhängig von der Piste.

Hier ist der Code Ich habe so weit:

<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>

Das macht Sinn für mich, da die Linie horizontal ist, und die linearen Gradienten sind vertikal, wobei die Kanten transparent und die Mitte der Linie fest ist grün.

Das Ergebnis ist erfreulich:

Herangezoomt, so können Sie die Steigung sehen:
http://img225.imageshack.us/img225/5027/horizontalsoftlinezoomeb.png

Wenn jedoch die Linie nicht mehr horizontal ist, wird der Gradient berechnet auf der Grundlage der Begrenzungsrechteck Linie, anstatt sich auf die Geometrie der Leitung selbst. Das Ergebnis ist eine schräge Linie, die vertikal schattiert ist, anstelle des Gradienten senkrecht zu der Linie ist:
  

Wer weiß, wie WPF weiche Kanten behandelt? Ich kann nicht alles auf Google oder MSDN finden, und ich weiß, gibt es eine Möglichkeit, diese somewhow zu tun ...

War es hilfreich?

Lösung

Nun, ich weiß nicht, ob das für Ihr Szenario anwendbar ist, aber man könnte einfach drehen wird die horizontale Linie mit Layout und die Steigung in Ordnung sein.

<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>

Andere Tipps

Versuchen Sie, eine Form statt einer Linie zu verwenden,

<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>

Tomer

Sie können eine Menge von Pfaden Stack mit zunehmender Dicke und Farbtöne abnimmt, einen über den anderen zu ziehen.

Für alle Pfade die gleiche Geometrie haben, sollten Sie verwenden Element Bindung an die Data Eigenschaft einer von ihnen.

Die meisten wahrscheinlich einige Code-behind wäre sinnvoll, die Pfade und Farbverläufe dynamisch zu generieren, falls erforderlich.

Sie könnten MappingMode="Absolute" auf Ihrem LinearGradientBrush 'gesetzt. Dann Pinsel Start / Ende-Koordinaten sind nicht relativ zu dem Begrenzungsrahmen. Natürlich würden Sie etwas Trigonometrie crunch müssen die richtigen Punkte zu bekommen ...

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top