在 WPF 工具包图表上移动轴标签的位置
Move location of axis labels on WPF Toolkit Chart
我有一张图表,一切正常,除了我需要 x 轴标签 'follow' y 轴过零。
我一直在玩弄标签边距,可以将标签偏移到网格线的左侧或右侧
<DVC:LinearAxis.AxisLabelStyle>
<Style TargetType="{x:Type DVC:AxisLabel}">
<Setter Property="Margin" Value="25,0,0,0" />
</Style>
</DVC:LinearAxis.AxisLabelStyle>
我不知道如何将标签向上移动图表以使其出现在中间。我将绑定到值以确定确切位置,但我什至不知道如何在垂直平面中移动标签。
非常感谢任何帮助或指点。
谢谢。
经过大量的反复试验和阅读文章,我终于找到了一个非常简单而优雅的解决方案。
我已将 AxisLabel
的边距 属性 绑定到图表区域的 ActualHeight
并使用 MultiValueConverter
创建正确的边距值。
XAML
<DVC:LinearAxis.AxisLabelStyle>
<Style TargetType="{x:Type DVC:AxisLabel}">
<Setter Property="Margin">
<Setter.Value>
<MultiBinding Converter="{StaticResource MarginConverter}">
<Binding Path="ActualHeight"
RelativeSource="{RelativeSource AncestorType={x:Type primitives:EdgePanel}}" />
<Binding Path="DataContext.ChartRange" RelativeSource="{RelativeSource FindAncestor,
AncestorType={x:Type DVC:LinearAxis}}" />
</MultiBinding>
</Setter.Value>
</Setter>
</Style>
</DVC:LinearAxis.AxisLabelStyle>
MarginConverter.cs
public class MarginConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
var height = 0d;
var chartHeight = (double) values[0];
var range = (Range<double>) values[1];
if (range.HasData)
{
if (range.Minimum > 0)
{
// Set labels to bottom
height = 0;
}
else if (range.Maximum < 0)
{
// Set labels to top
height = -chartHeight;
}
else
{
var rangeHeight = range.Maximum - range.Minimum;
var pointsPerHeight = chartHeight / rangeHeight;
height = range.Minimum * pointsPerHeight;
}
}
return new Thickness(25, height, 0, 0);
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
范围是我绘制图形然后绑定到VM上的属性时的最大和最小y值。
这是一个出奇优雅的解决方案,解决了我认为会非常 hacky 的问题。随着视图大小的调整,标签将重新定位为新的尺寸。
我有一张图表,一切正常,除了我需要 x 轴标签 'follow' y 轴过零。
我一直在玩弄标签边距,可以将标签偏移到网格线的左侧或右侧
<DVC:LinearAxis.AxisLabelStyle>
<Style TargetType="{x:Type DVC:AxisLabel}">
<Setter Property="Margin" Value="25,0,0,0" />
</Style>
</DVC:LinearAxis.AxisLabelStyle>
我不知道如何将标签向上移动图表以使其出现在中间。我将绑定到值以确定确切位置,但我什至不知道如何在垂直平面中移动标签。
非常感谢任何帮助或指点。
谢谢。
经过大量的反复试验和阅读文章,我终于找到了一个非常简单而优雅的解决方案。
我已将 AxisLabel
的边距 属性 绑定到图表区域的 ActualHeight
并使用 MultiValueConverter
创建正确的边距值。
XAML
<DVC:LinearAxis.AxisLabelStyle>
<Style TargetType="{x:Type DVC:AxisLabel}">
<Setter Property="Margin">
<Setter.Value>
<MultiBinding Converter="{StaticResource MarginConverter}">
<Binding Path="ActualHeight"
RelativeSource="{RelativeSource AncestorType={x:Type primitives:EdgePanel}}" />
<Binding Path="DataContext.ChartRange" RelativeSource="{RelativeSource FindAncestor,
AncestorType={x:Type DVC:LinearAxis}}" />
</MultiBinding>
</Setter.Value>
</Setter>
</Style>
</DVC:LinearAxis.AxisLabelStyle>
MarginConverter.cs
public class MarginConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
var height = 0d;
var chartHeight = (double) values[0];
var range = (Range<double>) values[1];
if (range.HasData)
{
if (range.Minimum > 0)
{
// Set labels to bottom
height = 0;
}
else if (range.Maximum < 0)
{
// Set labels to top
height = -chartHeight;
}
else
{
var rangeHeight = range.Maximum - range.Minimum;
var pointsPerHeight = chartHeight / rangeHeight;
height = range.Minimum * pointsPerHeight;
}
}
return new Thickness(25, height, 0, 0);
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
范围是我绘制图形然后绑定到VM上的属性时的最大和最小y值。
这是一个出奇优雅的解决方案,解决了我认为会非常 hacky 的问题。随着视图大小的调整,标签将重新定位为新的尺寸。