0

私のWPFアプリケーションでsoundcloud.comで使用されているような波形を描画しようとしています複数の垂直線を描画することでこれを行っています

私が望むのは、すべての線が同じ色の遷移を持つことです(したがって、水平方向のすべてのピクセルが同じ色になります)すべての線の長さが同じであるとは限らないため、各線は線の終わりに異なる色を持ちます.

LinearGradientBrush には多くのコンストラクターがあり、私のニーズに最も適しているのは LinearGradientBrush(GradientStopCollection, Point, Point) のようです。

LinearGradientContstructor に関する MSDN の記事

これらのポイントを使用すると、描画された線の外側に GradientStops を設定できるようです

ポイントの使い方がわからないのが難点。

var r = new GradientStopCollection();
r.Add(new GradientStop(Colors.Black, 0));
r.Add(new GradientStop(Colors.Red, 0.5));
r.Add(new GradientStop(Colors.Black, 1));

//this would be my main gradient background for all my lines (100%)
for (int i = 0; i < 25; i++)
{
  var line = new Line { X1 = i, X2 = i, Y1 = 0, Y2 = 200, Stroke = new LinearGradientBrush(r), StrokeThickness = 1 };
  WaveformCanvas.Children.Add(line);
}
//this would be an actual value of the waveform, points 0,0 and 1,1 seem to indicate that the gradientstops are exactly on the y1/y2
for (int i = 25; i < 50; i++)
{
  var line = new Line { X1 = i, X2 = i, Y1 = 50, Y2 = 150, Stroke = new LinearGradientBrush(r, new Point(0, 0), new Point(1, 1)), StrokeThickness = 1 };
  WaveformCanvas.Children.Add(line);
}
//these point values seem to be about correct for the current line length
//I came to these values by trial and error
for (int i = 50; i < 75; i++)
{
  var line = new Line { X1 = i, X2 = i, Y1 = 50, Y2 = 150, Stroke = new LinearGradientBrush(r, new Point(-0.5, -0.5), new Point(1.5, 1.5)), StrokeThickness = 1 };
  WaveformCanvas.Children.Add(line);
}

ポイント-0.5、-0.5のグラデーションは、描かれた線とは異なる角度を持っていないように見えるため、ポイントが2次元座標である理由に困惑しています

したがって、「メインの 100% グラデーション」に対してポイントを配置する方法を理解する必要があります。

または、より簡単な方法は、線を単色で描画し、その後、何らかの色選択を使用して、黒いピクセルを背景として長方形のグラデーションに置き換えることです。

4

1 に答える 1

1

GradientBrush.MappingMode プロパティを見てください。

LinearGradientBrush(GradientStopCollection, Point, Point)でブラシを初期化しBrushMappingMode.RelativeToBoundingBoxますが、必要だと思いますBrushMappingMode.Absolute。このためのコンストラクターのオーバーロードはありません。したがって、このプロパティを独自に設定する必要があります。

LinearGradientBrush brush = new LinearGradientBrush(r, new Point(0, 0), new Point(0, 200));
brush.MappingMode = BrushMappingMode.Absolute;
于 2012-06-07T02:16:42.067 に答える