Нарисуйте линию градиентной кистью (исчезните от начальной до конечной точки) - PullRequest
0 голосов
/ 21 декабря 2010

Моя задача довольно проста: нарисовать линию от точки A до точки B и установить разные цвета в точках A и B, например, белый на A и черный на B, чтобы затушить линию.

Я пыталсяДелая это, используя LinearGradientBrush:

var brush = new LinearGradientBrush(
                    Color.FromArgb(255, 0, 0, 0),
                    Color.FromArgb(255, 255, 0, 0), new Point(0, 0), new Point(1,1));
var pen = new Pen(brush, 10.0);

dc.DrawLine(pen, new Point (300, 300), new Point(300, 100));

Но это не приводит к желаемым результатам, так как GradientBrush отображается в соответствии с ограничивающей рамкой объекта.Таким образом, результаты для линии, идущей от 100/100 до 200/200, и линии, идущей в противоположном направлении, одинаковы (а это не то, что я хочу).

Как можно решить эту проблему с помощью WPF?Спасибо.

Редактировать: мне нужно использовать низкоуровневые графические функции (например, DrawLine) по соображениям производительности, потому что я рисую много линий.

Ответы [ 3 ]

1 голос
/ 21 декабря 2010

Как использовать статью LinearGradientBrush с примерами из кода XAML и C #.

Попробуйте этот подход и, пожалуйста, скажите, что вам нужно.Обратите внимание, что эти линии нарисованы в противоположных направлениях.

public partial class Window1 : Window
  {
    public Window1()
    {
      InitializeComponent();    
      var image = new Image
                    {
                      Source = new DrawingImage(CreateDrawingVisualRectangle(new Point(300,300), new Point(300,100) ).Drawing),
                      Stretch = Stretch.None,
                    };

      var image2 = new Image
                     {
                       Margin = new Thickness(10, 0, 0, 0),
        Source = new DrawingImage(CreateDrawingVisualRectangle(new Point(300, 100), new Point(300, 300)).Drawing),
        Stretch = Stretch.None,
      };

      var stackPanel = new StackPanel() {Orientation = Orientation.Horizontal};    
      stackPanel.Children.Add(image);
      stackPanel.Children.Add(image2);

      Content = stackPanel;
    }

    // Create a DrawingVisual that contains a rectangle.
    private DrawingVisual CreateDrawingVisualRectangle(Point start, Point end)
    {
      DrawingVisual drawingVisual = new DrawingVisual();

      // Retrieve the DrawingContext in order to create new drawing content.
      DrawingContext drawingContext = drawingVisual.RenderOpen();

      // Create a rectangle and draw it in the DrawingContext.
      var gradientStopCollection = new GradientStopCollection
                                     {
                                       new GradientStop(Color.FromArgb(255, 0, 0, 0), 0.0),
                                       new GradientStop(Color.FromArgb(255, 255, 0, 0), 0.75)
                                     };

      var brush = new LinearGradientBrush(gradientStopCollection);
      var pen = new Pen(brush, 10.0);

      var vector1 = new Vector(start.X, start.Y);
      var vector2 = new Vector(end.X, end.Y);

      if (vector1.Length < vector2.Length)
      {
        brush.StartPoint = new Point(1, 1);
        brush.EndPoint = new Point(0, 0);
      }

      drawingContext.DrawLine(pen, start, end);
      drawingContext.Close();
      return drawingVisual;
    }
  }
0 голосов
/ 11 апреля 2017

Как насчет использования прямоугольника?

 <Rectangle Height="2" Margin="10,0,10,10">
    <Rectangle.Fill>
      <LinearGradientBrush StartPoint="0,0.5" EndPoint="1,0.5">
         <GradientStop Color="White" Offset="0"/>
         <GradientStop Color="Transparent" Offset="1.0"/>
       </LinearGradientBrush>
   </Rectangle.Fill>
 </Rectangle>
0 голосов
/ 21 декабря 2010

Свойство MappingMode на кисти позволяет указывать абсолютные координаты начальной / конечной точек или координаты относительно границ фигур:

http://msdn.microsoft.com/en-us/library/system.windows.media.gradientbrush.mappingmode.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...