【问题标题】:LinearAxis without decimal numbers没有十进制数字的线性轴
【发布时间】:2014-07-07 15:44:35
【问题描述】:

我想避免在我的轴中使用十进制数字,我该怎么做?

XAML:

 <Charting:Chart   VerticalAlignment="Stretch" 
                HorizontalContentAlignment="Stretch">

        <Charting:Chart.Axes>
            <Charting:LinearAxis  Orientation="Y" Minimum="0" Title="" Location="Left"
                    />
        </Charting:Chart.Axes>

        <Charting:Chart.Series>

            <Charting:ColumnSeries ItemsSource="{Binding Persons}"
                        DependentValueBinding="{Binding Count}"
                        IndependentValueBinding="{Binding Category}">
            </Charting:ColumnSeries>
        </Charting:Chart.Series>
    </Charting:Chart>

【问题讨论】:

    标签: wpf silverlight data-visualization


    【解决方案1】:

    如果您仍在为此苦苦挣扎,或者其他人对此感兴趣: 解决方案几乎就是 baalazamon 写的。只是 {0:0.##} 将显示两个十进制数字(如果存在)(这就是“.##”的含义)。所以你应该写的是

    <Style x:Key="EmptyStyle" TargetType="charting:NumericAxisLabel"> 
        <Setter Property="IsTabStop" Value="False" /> 
        <Setter Property="StringFormat" Value="{0:0}" /> 
        <Setter Property="Template"> 
            <Setter.Value> 
                <ControlTemplate TargetType="charting:NumericAxisLabel"> 
                    <TextBlock /> 
                </ControlTemplate> 
            </Setter.Value> 
        </Setter> 
    </Style>
    

    当然你需要添加这个:

    <charting:LineSeries.DependentRangeAxis>    
            <charting:LinearAxis AxisLabelStyle="{StaticResource EmptyStyle}"    
                Orientation="Y"    
                ShowGridLines="True"/>    
    </charting:LineSeries.DependentRangeAxis>
    

    希望这能解决你的问题。

    【讨论】:

      【解决方案2】:

      LinearAxis 有一个 Iterval 属性。尝试设置

       <Charting:Chart.Axes>
              <Charting:LinearAxis Interval="1" Orientation="Y" Minimum="0" Title="" Location="Left" />
          </Charting:Chart.Axes>
      

      根据您的评论(对不起,我认为问题更简单;)),我使用类似的方法在 Y 轴上渲染标签:

      在资源中,使用这样的样式

      <Style x:Key="ChartLabelNoDecimal" TargetType="chartingToolkit:AxisLabel">
              <Setter Property="Template">
                  <Setter.Value>
                      <ControlTemplate TargetType="chartingToolkit:AxisLabel">
                          <TextBlock DataContext="{TemplateBinding FormattedContent}" Text="{Binding Converter={StaticResource NumericConverter1}}" FontSize="9" />
                      </ControlTemplate>
                  </Setter.Value>
              </Setter>
          </Style>
      
      public class NumericConverter : IValueConverter
      {
          public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
          {
              double x = double.Parse(value.ToString());
      
              if(/*check if has decimals*/) return string.Empty;
              else return x;
      
          }
      
          public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
          {
              throw new NotImplementedException();
          }
      }
      

      然后您可以将具有此样式的 LinearAxis 添加到图表中。我的 NumericConverter 只是测试图表要显示的标签的值,并根据我的逻辑对其进行格式化。您可以测试该值是否为整数,因此返回正确的字符串或为空。我认为它可以工作。

      【讨论】:

      • 谢谢米歇尔,但问题是我不希望间隔始终为 1,因为有时我的值非常高,例如间隔应该是 100。
      【解决方案3】:

      你可以把样式改成这个:

      <Style x:Key="EmptyStyle" TargetType="charting:NumericAxisLabel">
          <Setter Property="IsTabStop" Value="False" />
          <Setter Property="StringFormat" Value="{}{0:0.##}" />
          <Setter Property="Template">
              <Setter.Value>
                  <ControlTemplate TargetType="charting:NumericAxisLabel">
                      <TextBlock />
                  </ControlTemplate>
              </Setter.Value>
          </Setter>
      </Style>
      

      另外你需要创建:

      <charting:LineSeries.DependentRangeAxis>
              <charting:LinearAxis AxisLabelStyle="{StaticResource EmptyStyle}"
                  Orientation="Y"
                  ShowGridLines="True"/>
      </charting:LineSeries.DependentRangeAxis>
      

      这只是示例,您需要根据需要对其进行调整。 Example of slightly different thing 但也许你会发现它很有用。

      【讨论】:

        【解决方案4】:

        这是我想出的解决方案,摘自我的blog

        public class BarSeriesAxis : LinearAxis
        {
            protected override double CalculateActualInterval(Size availableSize)
            {
                var result = base.CalculateActualInterval(availableSize);
                return (result < 1.0) ? 1.0 : result;
            }
        }
        

        您让图表完成它们的工作,并在需要时覆盖间隔。很容易改变上面的四舍五入到最接近的整数。

        【讨论】:

        • 迄今为止最好的解决方案。这需要得到更多的支持。谢谢安德鲁!
        【解决方案5】:

        只需使用 LinearAxis 的 Interval 属性即可:

        <chartingToolkit:LinearAxis Orientation="Y" Interval="1" Minimum="0"/>
        

        很适合我。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2022-10-07
          • 2022-08-09
          • 2020-03-25
          • 2018-11-30
          • 2013-05-13
          • 2018-01-19
          • 2016-11-12
          • 1970-01-01
          相关资源
          最近更新 更多