WPF Dynamic Data Display图例显示异常及隐藏问题求助
解决方案
针对自定义图例样式失效问题
将自定义DataTemplate从LegendItemsPanel.Resources移至Chart.Resources层级,确保图表初始化时能正确识别并应用模板。同时保证模板的x:Key严格匹配目标类型的完整名称(此处为InteractiveDataDisplay.WPF.LineGraph)。
针对单个图例隐藏问题
- 给每个需要控制图例显示的
LineGraph/PolygonGraph添加绑定属性(如IsLegendVisible) - 在图例
DataTemplate中,将StackPanel的Visibility绑定到该属性,配合BoolToVisibilityConverter实现显示控制 - 对于不需要显示图例的图表元素,直接不设置
Description属性即可自动隐藏(如代码中MinMaxValues对应的PolygonGraph)
修改后的代码示例
<DataTemplate DataType="{x:Type viewModels:PlotResultWithTest}"> <wpf:Chart BottomTitle="{Binding XAxisTitle}" LeftTitle="{Binding YAxisTitle}"> <!-- 将DataTemplate移至Chart.Resources --> <wpf:Chart.Resources> <DataTemplate x:Key="InteractiveDataDisplay.WPF.LineGraph"> <StackPanel Orientation="Horizontal" Visibility="{Binding Path=Tag.IsLegendVisible, Converter={StaticResource BoolToVisibility}}"> <Line Width="15" Height="15" X1="0" Y1="0" X2="15" Y2="15" Stroke="{Binding Path=Stroke}" StrokeThickness="2"/> <TextBlock Margin="5 0 0 0" Text="{Binding Path=Description}"/> </StackPanel> </DataTemplate> <!-- 为PolygonGraph添加对应自定义模板 --> <DataTemplate x:Key="YourNamespace.PolygonGraph"> <StackPanel Orientation="Horizontal" Visibility="{Binding Path=Tag.IsLegendVisible, Converter={StaticResource BoolToVisibility}}"> <Rectangle Width="15" Height="15" Margin="0 0 5 0" Fill="{Binding Path=Fill}" Stroke="{Binding Path=Stroke}"/> <TextBlock Text="{Binding Path=Description}"/> </StackPanel> </DataTemplate> </wpf:Chart.Resources> <wpf:Chart.LegendContent> <wpf:LegendItemsPanel/> </wpf:Chart.LegendContent> <Interactions:Interaction.Behaviors> <behaviors:ChartBoundsBehavior/> </Interactions:Interaction.Behaviors> <wpf:Chart.ContextMenu> <ContextMenu DataContext="{Binding Path=PlacementTarget.DataContext, RelativeSource={RelativeSource Self}}"> <MenuItem Header="Reset" Command="{Binding ChartBounds.EnableAutoFitCommand}" /> </ContextMenu> </wpf:Chart.ContextMenu> <Grid> <!-- 无Description,自动隐藏图例 --> <controls:PolygonGraph Points="{Binding MinMaxValues, Mode=OneTime}" Stroke="{x:Null}" Fill="Transparent"/> <!-- 绑定IsLegendVisible属性控制图例显示 --> <wpf:LineGraph Points="{Binding FlTestValues, Mode=OneTime}" Description="{Binding FlTestDescription}" Stroke="{StaticResource FlightTestColor}" StrokeThickness="2" Visibility="{Binding FlTestVisible, Converter={StaticResource BoolToVisibility}}" Tag="{Binding}"/> <controls:PolygonGraph Points="{Binding FlTestBoundValues, Mode=OneTime}" Description="FT Tolerance" Stroke="Gray" StrokeThickness="1" Visibility="{Binding FlTestBoundsVisible, Converter={StaticResource BoolToVisibility}}" Tag="{Binding}"> <controls:PolygonGraph.Fill> <SolidColorBrush Color="Blue" Opacity="0.03"/> </controls:PolygonGraph.Fill> </controls:PolygonGraph> <wpf:LineGraph Points="{Binding MasterValues, Mode=OneTime}" Description="{Binding MasterDescription}" Stroke="{StaticResource MasterColor}" StrokeThickness="2" Visibility="{Binding MasterVisible, Converter={StaticResource BoolToVisibility}}" Tag="{Binding}"/> <controls:PolygonGraph Points="{Binding MasterBoundValues, Mode=OneTime}" Description="Master Tolerance" Stroke="Gray" Visibility="{Binding MasterBoundsVisible, Converter={StaticResource BoolToVisibility}}" Tag="{Binding}"> <controls:PolygonGraph.Fill> <SolidColorBrush Color="Magenta" Opacity="0.03"/> </controls:PolygonGraph.Fill> </controls:PolygonGraph> <ItemsControl ItemsSource="{Binding ValuesList}" Visibility="{Binding ResultVisible, Converter={StaticResource BoolToVisibility}}"> <ItemsControl.ItemsPanel> <ItemsPanelTemplate> <Grid/> </ItemsPanelTemplate> </ItemsControl.ItemsPanel> <ItemsControl.ItemTemplate> <DataTemplate> <!-- 无Description,自动隐藏图例 --> <wpf:LineGraph Points="{Binding FinalValues, Mode=OneTime}" StrokeThickness="2" Stroke="{Binding GoodValues, Converter={StaticResource ColorConverter}}" Visibility="{Binding ResultVisible, Converter={StaticResource BoolToVisibility}}"/> </DataTemplate> </ItemsControl.ItemTemplate> </ItemsControl> <wpf:LineGraph Points="{Binding Values, Mode=OneTime}" Description="{Binding Header}" Stroke="{StaticResource RecordingColor}" StrokeThickness="2" Visibility="{Binding ResultVisible, Converter={StaticResource BoolToVisibility}}" Tag="{Binding}"/> </Grid> </wpf:Chart> </DataTemplate>
补充说明
- 若使用
InteractiveDataDisplay.WPF库,图例条目由图表元素的Description属性驱动,无Description的元素不会生成图例项 - 若需要更灵活的图例控制,可自定义附加属性替代
Tag绑定,避免与其他业务逻辑冲突 - 确保
BoolToVisibilityConverter已在资源中正确定义
内容的提问来源于stack exchange,提问作者simone paolucci
相关产品推荐
相关产品推荐

