0

我有一个图表,除了我需要让 x 轴标签“跟随”y 轴过零之外,一切正常。

在此处输入图像描述

我一直在玩标签边距,可以将标签偏移到网格线的左侧或右侧

<DVC:LinearAxis.AxisLabelStyle>
                <Style TargetType="{x:Type DVC:AxisLabel}">
                    <Setter Property="Margin" Value="25,0,0,0" />
                </Style>
            </DVC:LinearAxis.AxisLabelStyle>

我不知道如何将标签向上移动以使其显示在中间。我将绑定到用于确定确切位置的值,但我什至无法弄清楚如何在垂直平面中移动标签。

非常感谢任何帮助或指示。

谢谢。

4

1 回答 1

1

经过大量的反复试验和阅读文章后,我终于整理出了一个非常简单而优雅的解决方案。

我已将 的边距属性绑定AxisLabelActualHeight图表区域的 ,并使用 aMultiValueConverter创建正确的边距值。

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>

保证金转换器.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();
        }

    }

Range 是我绘制图形然后绑定到 VM 上的属性时的最大和最小 y 值。

这是一个令人惊讶的优雅解决方案,我认为这将是相当 hacky。随着视图大小的调整,标签会以新的尺寸重新定位。

于 2018-09-04T03:01:20.687 回答