如何在WPF C#中部分着色一行(来自Code Behind)?

时间:2017-11-28 09:09:56

标签: c# wpf xaml

enter image description here

A行到B行是初始行(填充黑色)。我正在使用

绘制它
Rectangle = System.Windows.Shapes.Rectangle

我需要将从A1点到B点的相同直线用红色部分着色(如图所示)。

我怎么能从代码背后实现呢?

注意:我没有在这里重新创建(重新绘制)线条的奢侈。我只需要对现有的线进行部分着色,并根据其他条件进行操作,我可能需要将其恢复为黑色。

3 个答案:

答案 0 :(得分:4)

要创建一个简单的双色渐变,您需要在同一位置添加两个渐变停顿,以确保颜色不会慢慢从一个渐变到另一个。下面的帮助程序类演示了它的工作原理:

public static class GradientGenerator
{
    public static Brush GenerateTwoColorBrush(Color color1, Color color2, double ratio)
    {
        GradientStopCollection collection = new GradientStopCollection();

        collection.Add(new GradientStop(color1, 0));
        collection.Add(new GradientStop(color1, ratio));
        collection.Add(new GradientStop(color2, ratio));
        collection.Add(new GradientStop(color2, 1.0));

        LinearGradientBrush brush = new LinearGradientBrush(collection);
        return brush;
    }
}

在您的代码隐藏中,您可以简单地调用生成器的方法以指定的比例(0.0 - 1.0)获取两种颜色的渐变:

rectBlack.Fill = GenerateTwoColorBrush(Colors.Black, Colors.Red, 0.5);

如果您需要水平或倾斜渐变,只需设置StartPoint的{​​{1}}和EndPoint属性。

预期结果:

How it would / should look

如果您决定采用更多MVVM-ish方法,或者在XAML中创建树,您只需使用此方法LinearGradientBrush即可自动更新画笔。

IValueConverter

以上例子是这样做的:

public class RatioToGradientConverter : IValueConverter
{
    public Color Color1 { get; set; }
    public Color Color2 { get; set; }

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        double ratio = 0;
        if (value is double)
            ratio = (double) value;

        return GradientGenerator.GenerateTwoColorBrush(Color1, Color2, ratio);
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return DependencyProperty.UnsetValue;
    }
}

答案 1 :(得分:2)

你可以在LinearGradientBrush的帮助下实现这一点,即在你的资源中定义画笔并使用它。

Tip: How to use a LinearGradientBrush

下面是MSDN的示例代码格式,即Rectangle,但您可以使用相同的笔刷编码。

Rectangle diagonalFillRectangle = new Rectangle();
diagonalFillRectangle.Width = 200;
diagonalFillRectangle.Height = 100;

// Create a diagonal linear gradient with four stops.   
LinearGradientBrush myLinearGradientBrush =
    new LinearGradientBrush();
myLinearGradientBrush.StartPoint = new Point(0,0);
myLinearGradientBrush.EndPoint = new Point(1,1);
myLinearGradientBrush.GradientStops.Add(
    new GradientStop(Colors.Yellow, 0.0));
myLinearGradientBrush.GradientStops.Add(
    new GradientStop(Colors.Red, 0.25));                
myLinearGradientBrush.GradientStops.Add(
    new GradientStop(Colors.Blue, 0.75));        
myLinearGradientBrush.GradientStops.Add(
    new GradientStop(Colors.LimeGreen, 1.0));

// Use the brush to paint the rectangle.
diagonalFillRectangle.Fill = myLinearGradientBrush;

Painting with Solid Colors and Gradients Overview

答案 2 :(得分:0)

您可能还想考虑以下想法:

将矩形分成两部分,这意味着最后你将A从A1渲染为黑色,而第二个从A1到B以红色绘制。