如何用一些颜色填充矩形,使用渐变但仅作为工具(没有可见渐变)?
How to fill the rectangle with some colors, using gradient but only as a tool(without visible gradient)?
我正在为矩形的 "Fill" 属性 制作转换器,以用不同的颜色填充它。
所以我有一个关于某人缺席日期的信息列表。如果一个人在一段时间内不在,则矩形的不同部分必须用color1填充,否则用color2填充。对于 FOR 中的每个人,我计算日期之间的差异并填充渐变停止点,如:color1-border-color2-border-color1 ...
我试着让边框几乎不可见。
转换器:
double bufferOffset = 0.0;
double taskPeriodInDays = (endDate.Value.Date -
startDate.Value.Date).TotalDays;
List<double> timeSections = new List<double>();
for (int i = 1; i < absencesDatesBetweenStartAndEnd.Count; i++)
{
IsAbsent = !IsAbsent;
GradientStop color = new GradientStop();
GradientStop border = new GradientStop();
border.Color = Colors.Black;
color.Color = IsAbsent ? Colors.Orange : Colors.Violet;
color.Offset = i == 1 ? 0 : bufferOffset;
gradient.GradientStops.Add(color);
color.Offset = bufferOffset + (absencesDatesBetweenStartAndEnd[i].Date - absencesDatesBetweenStartAndEnd[i - 1].Date).TotalDays / taskPeriodInDays;
gradient.GradientStops.Add(color);
if(i == absencesDatesBetweenStartAndEnd.Count - 1)
{
break;
}
border.Offset = color.Offset + 0.00001;
gradient.GradientStops.Add(border);
border.Offset = border.Offset + 0.00001;
gradient.GradientStops.Add(border);
bufferOffset = border.Offset;
}
return gradient;
<Rectangle Fill="{Binding Converter={StaticResource TaskExecutorAbsenceColorConverter}}"/>
硬编码 XAML 用于尝试值:
<Rectangle.Fill>
<LinearGradientBrush StartPoint="0 0" EndPoint="1 0">
<GradientStop Color="red" Offset="0"/>
<GradientStop Color="red" Offset="0.065573770491803282"/>
<GradientStop Color="black" Offset="0.065583770491803278"/>
<GradientStop Color="black" Offset="0.065593770491803274"/>
<GradientStop Color="blue" Offset="0.065593770491803274"/>
<GradientStop Color="blue" Offset="0.29510196721311477"/>
<GradientStop Color="black" Offset="0.29511196721311478"/>
<GradientStop Color="black" Offset="0.29512196721311479"/>
<GradientStop Color="red" Offset="0.29512196721311479"/>
<GradientStop Color="red" Offset="0.36069573770491808"/>
<GradientStop Color="black" Offset="0.36070573770491809"/>
<GradientStop Color="black" Offset="0.3607157377049181"/>
<GradientStop Color="blue" Offset="0.3607157377049181"/>
<GradientStop Color="blue" Offset="0.50825672131147548"/>
<GradientStop Color="black" Offset="0.50826672131147543"/>
<GradientStop Color="black" Offset="0.50827672131147539"/>
<GradientStop Color="red" Offset="0.50827672131147539"/>
<GradientStop Color="red" Offset="1.00008"/>
</LinearGradientBrush>
</Rectangle.Fill>
转换器工作不正常。渐变可见。
如您所见,我尝试将 gradientstops 的值放入 XAML,在这种情况下效果很好。我不明白为什么。
Hardcoding values in XAML
Using converter
可能最合适的方法是使用带有彩色矩形的 ItemsControl。但是如果你仍然想要一个画笔,你可以像这样使用视觉画笔:
public class Conv : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
VisualBrush result = new VisualBrush();
result.Stretch = Stretch.Fill;
StackPanel container = new StackPanel();
container.Orientation = Orientation.Horizontal;
//Generate a colored rectangle for each day.
//I just use some random values for illustration.
Random rnd = new Random();
for (int i = 0; i < 10; i++)
{
Rectangle rect = new Rectangle();
rect.Width = 20;
rect.Height = 20;
rect.Fill = rnd.Next() % 2 == 0 ? Brushes.Red : Brushes.Green;
container.Children.Add(rect);
}
result.Visual = container;
return result;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
我正在为矩形的 "Fill" 属性 制作转换器,以用不同的颜色填充它。
所以我有一个关于某人缺席日期的信息列表。如果一个人在一段时间内不在,则矩形的不同部分必须用color1填充,否则用color2填充。对于 FOR 中的每个人,我计算日期之间的差异并填充渐变停止点,如:color1-border-color2-border-color1 ... 我试着让边框几乎不可见。
转换器:
double bufferOffset = 0.0;
double taskPeriodInDays = (endDate.Value.Date -
startDate.Value.Date).TotalDays;
List<double> timeSections = new List<double>();
for (int i = 1; i < absencesDatesBetweenStartAndEnd.Count; i++)
{
IsAbsent = !IsAbsent;
GradientStop color = new GradientStop();
GradientStop border = new GradientStop();
border.Color = Colors.Black;
color.Color = IsAbsent ? Colors.Orange : Colors.Violet;
color.Offset = i == 1 ? 0 : bufferOffset;
gradient.GradientStops.Add(color);
color.Offset = bufferOffset + (absencesDatesBetweenStartAndEnd[i].Date - absencesDatesBetweenStartAndEnd[i - 1].Date).TotalDays / taskPeriodInDays;
gradient.GradientStops.Add(color);
if(i == absencesDatesBetweenStartAndEnd.Count - 1)
{
break;
}
border.Offset = color.Offset + 0.00001;
gradient.GradientStops.Add(border);
border.Offset = border.Offset + 0.00001;
gradient.GradientStops.Add(border);
bufferOffset = border.Offset;
}
return gradient;
<Rectangle Fill="{Binding Converter={StaticResource TaskExecutorAbsenceColorConverter}}"/>
硬编码 XAML 用于尝试值:
<Rectangle.Fill>
<LinearGradientBrush StartPoint="0 0" EndPoint="1 0">
<GradientStop Color="red" Offset="0"/>
<GradientStop Color="red" Offset="0.065573770491803282"/>
<GradientStop Color="black" Offset="0.065583770491803278"/>
<GradientStop Color="black" Offset="0.065593770491803274"/>
<GradientStop Color="blue" Offset="0.065593770491803274"/>
<GradientStop Color="blue" Offset="0.29510196721311477"/>
<GradientStop Color="black" Offset="0.29511196721311478"/>
<GradientStop Color="black" Offset="0.29512196721311479"/>
<GradientStop Color="red" Offset="0.29512196721311479"/>
<GradientStop Color="red" Offset="0.36069573770491808"/>
<GradientStop Color="black" Offset="0.36070573770491809"/>
<GradientStop Color="black" Offset="0.3607157377049181"/>
<GradientStop Color="blue" Offset="0.3607157377049181"/>
<GradientStop Color="blue" Offset="0.50825672131147548"/>
<GradientStop Color="black" Offset="0.50826672131147543"/>
<GradientStop Color="black" Offset="0.50827672131147539"/>
<GradientStop Color="red" Offset="0.50827672131147539"/>
<GradientStop Color="red" Offset="1.00008"/>
</LinearGradientBrush>
</Rectangle.Fill>
转换器工作不正常。渐变可见。
如您所见,我尝试将 gradientstops 的值放入 XAML,在这种情况下效果很好。我不明白为什么。
Hardcoding values in XAML Using converter
可能最合适的方法是使用带有彩色矩形的 ItemsControl。但是如果你仍然想要一个画笔,你可以像这样使用视觉画笔:
public class Conv : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
VisualBrush result = new VisualBrush();
result.Stretch = Stretch.Fill;
StackPanel container = new StackPanel();
container.Orientation = Orientation.Horizontal;
//Generate a colored rectangle for each day.
//I just use some random values for illustration.
Random rnd = new Random();
for (int i = 0; i < 10; i++)
{
Rectangle rect = new Rectangle();
rect.Width = 20;
rect.Height = 20;
rect.Fill = rnd.Next() % 2 == 0 ? Brushes.Red : Brushes.Green;
container.Children.Add(rect);
}
result.Visual = container;
return result;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}