我正在尝试在WPFToolkit图表中设置饼图数据点的样式。基本上我想改变工具提示。它有效,但数据点的视觉状态不会改变。
我已从源中复制样式并仅修改工具提示以添加FormattedIndependentValue
。风格如下:
<!-- charting:PieDataPoint -->
<Style x:Key="PieDataPointStyle" TargetType="charting:PieDataPoint">
<Setter Property="Background" Value="Orange" />
<Setter Property="BorderBrush" Value="White" />
<Setter Property="BorderThickness" Value="0" />
<Setter Property="IsTabStop" Value="False" />
<Setter Property="RatioStringFormat" Value="{}{0:p2}" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="charting:PieDataPoint">
<Grid x:Name="Root" Opacity="1">
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="CommonStates">
<VisualStateGroup.Transitions>
<VisualTransition GeneratedDuration="0:0:0.1" />
</VisualStateGroup.Transitions>
<VisualState x:Name="Normal" />
<VisualState x:Name="MouseOver">
<Storyboard>
<DoubleAnimation Storyboard.TargetName="MouseOverHighlight" Storyboard.TargetProperty="Opacity" To="0.6" Duration="0" />
</Storyboard>
</VisualState>
</VisualStateGroup>
<VisualStateGroup x:Name="SelectionStates">
<VisualStateGroup.Transitions>
<VisualTransition GeneratedDuration="0:0:0.1" />
</VisualStateGroup.Transitions>
<VisualState x:Name="Unselected" />
<VisualState x:Name="Selected">
<Storyboard>
<DoubleAnimation Storyboard.TargetName="SelectionHighlight" Storyboard.TargetProperty="Opacity" To="0.6" Duration="0" />
</Storyboard>
</VisualState>
</VisualStateGroup>
<VisualStateGroup x:Name="RevealStates">
<VisualStateGroup.Transitions>
<VisualTransition GeneratedDuration="0:0:0.5" />
</VisualStateGroup.Transitions>
<VisualState x:Name="Shown">
<Storyboard>
<DoubleAnimation Storyboard.TargetName="Root" Storyboard.TargetProperty="Opacity" To="1" Duration="0" />
</Storyboard>
</VisualState>
<VisualState x:Name="Hidden">
<Storyboard>
<DoubleAnimation Storyboard.TargetName="Root" Storyboard.TargetProperty="Opacity" To="0" Duration="0" />
</Storyboard>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
<Path x:Name="Slice" Data="{TemplateBinding Geometry}"
Fill="{TemplateBinding Background}"
Stroke="{TemplateBinding BorderBrush}"
StrokeMiterLimit="1">
<ToolTipService.ToolTip>
<StackPanel>
<ContentControl Content="{TemplateBinding FormattedIndependentValue}" />
<ContentControl Content="{TemplateBinding FormattedDependentValue}" />
<ContentControl Content="{TemplateBinding FormattedRatio}" />
</StackPanel>
</ToolTipService.ToolTip>
</Path>
<Path x:Name="SelectionHighlight" Data="{TemplateBinding GeometrySelection}" Fill="Red" StrokeMiterLimit="1" IsHitTestVisible="False" Opacity="0" />
<Path x:Name="MouseOverHighlight" Data="{TemplateBinding GeometryHighlight}" Fill="White" StrokeMiterLimit="1" IsHitTestVisible="False" Opacity="0" />
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
然后我用它来定义图表的调色板。
<datavis:ResourceDictionaryCollection x:Key="ChartPallete">
<!-- blue -->
<ResourceDictionary>
<Style x:Key="DataPointStyle" TargetType="charting:PieDataPoint" BasedOn="{StaticResource PieDataPointStyle}">
<Setter Property="Background" Value="#007d9d"/>
</Style>
</ResourceDictionary>
<!-- green -->
<ResourceDictionary>
<Style x:Key="DataPointStyle" TargetType="charting:PieDataPoint" BasedOn="{StaticResource PieDataPointStyle}">
<Setter Property="Background" Value="#8fcd3e"/>
</Style>
</ResourceDictionary>
<!-- more resource dictionaries to a total of 15 -->
<datavis:ResourceDictionaryCollection x:Key="ChartPalette">
这个调色板我设置为PieSeries
。
var series = new PieSeries();
series.Palette = Resources["ChartPalette"] as ResourceDictionaryCollection;
调色板中的颜色正确用于切片,工具提示正确显示,但是当我悬停鼠标或单击数据点(切片)时,视觉状态不会改变。没有任何故事板被执行。
任何想法我做错了什么?
注意(对于精明的读者):除了工具提示之外,我还将Grid
(Root
元素)的不透明度更改为1
,因为视觉状态不会更改将Opacity
设置为1的故事板未执行,切片将完全不透明。
答案 0 :(得分:1)
这是Toolkit v3.5的一些奇怪且未知的错误,它仍保留在官方版本中。
但您可以下载适用于WPF4的Toolkit图表的开发者版本,此处为the blog post和the direct link to the zip-archive(\Binaries\WPF4\
)。如果链接将来停止工作,我可以将此文件上传到其他位置。
然后你的例子就可以了。图表系列也应该有IsSelectionEnabled="True"
,但我想你已经做过了。
答案 1 :(得分:0)
我有同样的问题,但是以不同的方式解决了。 VisualStateManager在两个程序集中定义:一个来自.NET Framework,另一个来自WPF工具箱。实际上,在覆盖数据点样式时通常会出现此警告。
解决方案是使用WPF工具包中的VisualStateManager。为此,请将此命名空间导入为xmlns:
xmlns:vsm="clr-namespace:System.Windows;assembly=WPFToolkit"
然后,在定义数据点样式时引用此命名空间:
<Style x:Key="CustomPieDataPointStyle"
BasedOn="{StaticResource {x:Type chartingToolkit:PieDataPoint}}"
TargetType="chartingToolkit:PieDataPoint">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="chartingToolkit:PieDataPoint">
<Grid x:Name="Root" Opacity="0">
<vsm:VisualStateManager.VisualStateGroups>
<vsm:VisualStateGroup x:Name="CommonStates">
<vsm:VisualStateGroup.Transitions>
<vsm:VisualTransition GeneratedDuration="0:0:0.1" />
</vsm:VisualStateGroup.Transitions>
<vsm:VisualState x:Name="Normal" />
<vsm:VisualState x:Name="MouseOver">
<Storyboard>
<DoubleAnimation Storyboard.TargetName="MouseOverHighlight" Storyboard.TargetProperty="Opacity" To="0.6" Duration="0" />
</Storyboard>
</vsm:VisualState>
</vsm:VisualStateGroup>
这对我有用。