【问题标题】:WPF Toolkit Chart Axes cannot be set through StyleWPF Toolkit Chart Axes 无法通过 Style 设置
【发布时间】:2013-07-16 06:50:16
【问题描述】:

我正在使用 WPF 工具包 (System.Windows.Controls.DataVisualization.Toolkit) 来生成一个简单的图表。为了将 Y 轴设置为从零值开始,我将 Chart.Axes 属性设置如下:

<chartingToolkit:Chart Width="800" Height="400" Title="Usage" Style="{StaticResource ChartStyle}">
    <chartingToolkit:Chart.Axes>
        <chartingToolkit:LinearAxis Orientation="Y" Minimum="0" />
    </chartingToolkit:Chart.Axes>

    <chartingToolkit:LineSeries DependentValuePath="Value" IndependentValuePath="Key" ItemsSource="{Binding Data}" />

</chartingToolkit:Chart>

这很好用。但是,当我尝试通过Style 设置此属性时,智能感知甚至不显示Axes

<Style x:Key="ChartStyle" TargetType="{x:Type chartingToolkit:Chart}">
    <Setter Property="Axes">
        <Setter.Value>
            <chartingToolkit:LinearAxis Orientation="Y" Minimum="0" />
        </Setter.Value>
    </Setter>
</Style>

如果我运行代码,我会得到一个 ArgumentNullExceptionProperty 不能为空。这是Style.Setter.Property。我在 Codeplex 查看了源代码,发现了 Axes 属性:

[SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly", Justification = "Setter is public to work around a limitation with the XAML editing tools.")]
[SuppressMessage("Microsoft.Usage", "CA1801:ReviewUnusedParameters", MessageId = "value", Justification = "Setter is public to work around a limitation with the XAML editing tools.")]
public Collection<IAxis> Axes
{
    get
    {
        return _axes;
    }
    set
    {
        throw new NotSupportedException(Properties.Resources.Chart_Axes_SetterNotSupported);
    }
}

这里说 Setter 是公开的,但我找不到任何这样的公开方法。现在我的问题是:

  1. 通过 Style 设置属性在技术上与本问题中的第一段代码有何不同?
  2. 有没有办法通过样式设置Axes 属性?
  3. 我还应该使用 WPF 工具包制作图表吗?有没有更新的“经典”方法来生成我不知道的图表?

【问题讨论】:

  • 您必须将样式附加到 linearAxis 本身,因为图表样式中没有访问器。

标签: c# wpf xaml dependency-properties wpftoolkit


【解决方案1】:

你已经接近了:)

您必须将样式附加到 linearAxis 本身,因为图表样式没有访问器。

风格是这样的:

<Style x:Key="linearAxisStyle" TargetType="{x:Type charting:LinearAxis}">
        <Setter Property="Orientation" Value="Y" />
        <Setter Property="Minimum" Value="0" />
</Style>

绑定是这样的:

<chartingToolkit:Chart Width="800" Height="400" Title="Usage" Style="{StaticResource ChartStyle}">
<chartingToolkit:Chart.Axes>      
  <chartingToolkit:LinearAxis Style="{StaticResource linearAxisStyle}" />
<chartingToolkit:Chart.Axes/>

<chartingToolkit:LineSeries DependentValuePath="Value" IndependentValuePath="Key" ItemsSource="{Binding Data}" />

【讨论】:

  • 这样我仍然必须在Chart 声明中声明我的Axes,而不是在样式中单独声明。主要问题仍然是:“如果我可以在 Chart 块下设置属性,为什么不能使用样式设置它?”请注意,我已更改问题的顺序。感谢您的调查。
  • 对,所以解决方案将是我的第一个答案,解释是第二个。
【解决方案2】:

自从您更改请求后,我将在新项目中回答......

您希望默认语法是这样的:

<Style x:Key="linearAxisStyle_Alt" TargetType="{x:Type charting:Chart}">
        <Setter Property="Axes">
            <Setter.Value>
                <Setter Property="LinearAxis">
                    <Setter.Value>
                        <charting:LinearAxis Orientation="Y" Minimum="0" />
                    </Setter.Value>
                </Setter>
            </Setter.Value>
        </Setter>
</Style>

问题(实际上不是问题)是“轴”元素没有样式属性。因此,您不能设置由其子项继承的样式 - LinearAxis。 这就是您收到错误消息的原因:“属性不能为空”。当然不能,因为它不存在。

因此,您的请求的最终答案是 - (不幸的是)这是不可能的。 希望这能让您更好地理解。

【讨论】:

  • 是的 Axes 没有样式属性。 Axes 实际上是一个属性——实现IAxis 的对象的Collection,其中一个是LinearAxis。在Chart 声明中,我可以将LinearAxis 对象添加到此集合中。但是,我不能通过Chart 的风格将相同的对象添加到同一个集合中——这让我感到困惑。这并不是说我要设置AxesLinearAxis 的样式。无论如何,再次感谢。
  • 我理解您的困惑,并且您对界面和轴集合是正确的。但是,在应用程序本身中设置属性和在资源 dic 中创建样式定义之间存在很大差异。无论如何,我希望你的问题得到解答。
  • 我猜答案在于您提到的差异 - 关于您设置属性的位置。我将不得不在该领域阅读更多内容。我会保持这个问题的开放性,因为还没有明确的答案。谢谢
  • 恕我直言,当有解释为什么它不起作用以及正确的方法时,让这个问题保持开放是没有意义的。很抱歉您对此感到不满意。问候
猜你喜欢
  • 1970-01-01
  • 2023-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多