WPF - 具有百分比值的 StrokeDashArray
WPF - StrokeDashArray with percentage values
使用WPF时,可以使用StrokeDashArray="1,10,5,5"
等方式绘制StrokeDashArrays
但是,我在椭圆形状上使用 StrokeDashArray-属性,我不想在绘制此椭圆时计算所有双精度值。
是否可以以某种方式使用百分比值?
像 StrokeDashArray="10%, 50%, 25%, 15%"
...
编辑: 我忘了在这个上下文中附加我对 percentage
的定义:完整行的百分比。
例如:
如果您有一个半径为 100px 的 circle/ellipse,则周长为 2π * 100
,值 10%
为 2π * 100px * 0.1 = 62.8px
.这62.8px应该是对应段的长度,用10%
表示
绑定到 Ellipse
的 Width
属性 并使用转换器来计算笔划破折号数组。如果 Ellipse
不是圆圈,我不确定在那种情况下你想要发生什么...
<Ellipse StrokeDashArray="{Binding Width, RelativeSource={RelativeSource Self}, Converter={StaticResource EllipseStrokeConverter}}" Width="100" Height="100"/>
转换器:
public class EllipseStrokeConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
var width = (double)value;
var strokeDashArray = new DoubleCollection();
strokeDashArray.Add(CalculatePercentage(width, 0.1));
strokeDashArray.Add(CalculatePercentage(width, 0.5));
strokeDashArray.Add(CalculatePercentage(width, 0.25));
strokeDashArray.Add(CalculatePercentage(width, 0.15));
return strokeDashArray;
}
private double CalculatePercentage(double width, double percent)
{
return 2 * 3.14 * (width / 2) * percent;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
使用WPF时,可以使用StrokeDashArray="1,10,5,5"
等方式绘制StrokeDashArrays
但是,我在椭圆形状上使用 StrokeDashArray-属性,我不想在绘制此椭圆时计算所有双精度值。
是否可以以某种方式使用百分比值?
像 StrokeDashArray="10%, 50%, 25%, 15%"
...
编辑: 我忘了在这个上下文中附加我对
percentage
的定义:完整行的百分比。
例如:
如果您有一个半径为 100px 的 circle/ellipse,则周长为 2π * 100
,值 10%
为 2π * 100px * 0.1 = 62.8px
.这62.8px应该是对应段的长度,用10%
绑定到 Ellipse
的 Width
属性 并使用转换器来计算笔划破折号数组。如果 Ellipse
不是圆圈,我不确定在那种情况下你想要发生什么...
<Ellipse StrokeDashArray="{Binding Width, RelativeSource={RelativeSource Self}, Converter={StaticResource EllipseStrokeConverter}}" Width="100" Height="100"/>
转换器:
public class EllipseStrokeConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
var width = (double)value;
var strokeDashArray = new DoubleCollection();
strokeDashArray.Add(CalculatePercentage(width, 0.1));
strokeDashArray.Add(CalculatePercentage(width, 0.5));
strokeDashArray.Add(CalculatePercentage(width, 0.25));
strokeDashArray.Add(CalculatePercentage(width, 0.15));
return strokeDashArray;
}
private double CalculatePercentage(double width, double percent)
{
return 2 * 3.14 * (width / 2) * percent;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}