当RenderableSeries绑定到MVVM时,SciChart上的RolloverModifier的DataTemplate

时间:2017-04-20 16:12:12

标签: wpf xaml mvvm scichart

我正在尝试使用RolloverModifier(结合DataTemplate的{​​{1}}属性自定义SciChart折线图上显示的TooltipTemplate工具提示的外观,但无法弄清楚。

这是我的RolloverModifier,我尽可能简单地使其工作。

DataTemplate

到目前为止我尝试过的事情:

首先:

<DataTemplate x:Key="ChartToolTipTemplate" DataType="{x:Type s:SeriesInfo}">
   <TextBlock Text="Hello" />
</DataTemplate>

但是我收到了错误:

  

无法投射类型&#39; SciChart.Charting.ChartModifiers.RolloverModifier&#39;输入&#39; SciChart.Charting.Visuals.RenderableSeries.BaseRenderableSeries&#39;。

从网上研究看,我应该做的是:

<s:RolloverModifier x:Name="RolloverModifier" TooltipTemplate="{StaticResource ChartToolTipTemplate}">

然而,这对我来说并不好,因为我的<s:SciChartSurface.RenderableSeries> <s:FastLineRenderableSeries s:TooltipModifier.TooltipTemplate="{StaticResource TooltipTemplate}" s:TooltipModifier.IncludeSeries="True" s:SeriesValueModifier.IncludeSeries="False"/> </s:SciChartSurface.RenderableSeries> 已绑定到我的ViewModel中的RenderableSeries

ObservableCollection<IRenderableSeries>

对此类似问题的建议是使用<s:SciChartSurface x:Name="SciChart" Grid.Column="0" Annotations="{Binding Annotations}" GridLinesPanelStyle="{StaticResource GridLinesPanelStyle}" RenderableSeries="{Binding ChartSeries}" Style="{StaticResource SurfaceStyle}"> 并根据文档中的此页面设置ViewModel中的样式:Bind Tooltip Templates or Attached Properties in MVVM,但我无法弄清楚如何将我的ObservableCollection<IRenderableSeriesViewModel>转换为IRenderableSeries,最后得到一张空白图表。

这个类似问题的另一个建议(SciChart: Custom RolloverModifierLabel for multiple DataSeries bound from code是使用隐式样式,所以我添加了

LineRenderableSeriesViewModel

保持

    <s:SciChartSurface.Resources>
        <Style TargetType="s:BaseRenderableSeries">
            <Setter Property="s:RolloverModifier.TooltipTemplate" Value="{StaticResource ChartToolTipTemplate}" />
            <Setter Property="s:RolloverModifier.IncludeSeries" Value="True" />
            <Setter Property="s:RolloverModifier.IsEnabled" Value="True" />
            <Setter Property="FontSize" Value="30" />
        </Style>
    </s:SciChartSurface.Resources>

但是样式对工具提示完全没有影响(甚至是我刚刚放入的 <s:SciChartSurface.ChartModifier> <s:ModifierGroup> <s:LegendModifier x:Name="LegendModifier" Margin="10" HorizontalAlignment="Right" LegendTemplate="{StaticResource LegendTemplate}" Orientation="Horizontal" ShowLegend="{Binding ShowLegend}" ShowVisibilityCheckboxes="False" /> <s:RolloverModifier x:Name="RolloverModifier" /> <s:SeriesSelectionModifier> <s:SeriesSelectionModifier.SelectedSeriesStyle> <Style TargetType="s:BaseRenderableSeries"> <Setter Property="Stroke" Value="DeepPink" /> <Setter Property="StrokeThickness" Value="3" /> </Style> </s:SeriesSelectionModifier.SelectedSeriesStyle> </s:SeriesSelectionModifier> </s:ModifierGroup> </s:SciChartSurface.ChartModifier> 位来检查它是否正常工作)。删除该行会完全删除工具提示。

2 个答案:

答案 0 :(得分:1)

我已经为你做了一些挖掘,因为这个问题被问了很多。

基本上问题是在SciChart WPF库中,BaseRenderableSeriesFastLineRenderableSeries已经有一个默认样式(没有x:键的样式),所以要隐式覆盖它,你必须设置类型等于系列类型。覆盖基础不起作用。

以下代码确实有效。放置在Window.Resources中,它将红色笔触和笔触粗细应用于FastLineRenderableSeries中的所有SciChartSurface

<Window x:Class="WpfApplication3.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:s="http://schemas.abtsoftware.co.uk/scichart"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <Style TargetType="{x:Type FastLineRenderableSeries}">
            <Setter Property="Stroke" Value="#FF3333"/>
            <Setter Property="StrokeThickness" Value="5"/>
        </Style>    
    </Window.Resources>
    <Grid>
        <s:SciChartSurface>
            <s:SciChartSurface.RenderableSeries>
                <s:FastLineRenderableSeries x:Name="lineSeries"/>
            </s:SciChartSurface.RenderableSeries>

            <s:SciChartSurface.XAxis>
                <s:NumericAxis/>
            </s:SciChartSurface.XAxis>

            <s:SciChartSurface.YAxis>
                <s:NumericAxis/>
            </s:SciChartSurface.YAxis>
        </s:SciChartSurface>
    </Grid>
</Window>

enter image description here

您需要为要为其设置默认工具提示的所有系列类型添加样式,并且此样式将全部应用于它们。

答案 1 :(得分:0)

我最终得到了MVVM方法。根据mm8的评论,我已经绑定到ObservableCollection<IRenderableSeriesViewModel>,但我试图将ObservableCollection<IRenderableSeries>复制到它,所以我将其改为仅从头开始构建前者。

return new LineRenderableSeriesViewModel()
       {
           DataSeries = dataSeries,
           Stroke = stroke,
           StrokeThickness = 2,
           StyleKey = "ChartTooltipStyle",
           AntiAliasing = true
       };

然后在XAML ......

(部分感谢SciChart,此页面:WPF Chart Custom Tooltip Template Example

<UserControl.Resources>

<!-- etc. etc. -->

    <DropShadowEffect x:Key="DropShadowEffect" BlurRadius="5" Direction="-45" ShadowDepth="6" Color="{StaticResource MyBlack}"></DropShadowEffect>

    <DataTemplate x:Key="ChartToolTipTemplate" DataType="{x:Type s:SeriesInfo}">

        <Border Padding="4, 2, 4, 1" 
                Margin="4, 0, 0, 2" 
                BorderThickness="0" 
                CornerRadius="0"
                Effect="{StaticResource DropShadowEffect}">

            <Border.Background>
                <SolidColorBrush Color="{Binding Stroke}" />
            </Border.Background>
            <TextBlock>
                <TextBlock.Text>
                    <MultiBinding StringFormat="{}{0}: {1:0.00}">
                        <Binding Path="SeriesName" />
                        <Binding Path="Value" />
                    </MultiBinding>
                </TextBlock.Text>
            </TextBlock>
        </Border>
    </DataTemplate>

    <Style x:Key="ChartToolTipContainerStyle" TargetType="s:TooltipControl">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="s:TooltipControl">
                    <ContentPresenter Content="{TemplateBinding DataContext}" ContentTemplate="{TemplateBinding ContentTemplate}" />
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

    <Style TargetType="s:FastLineRenderableSeries" x:Key="ChartTooltipStyle">
        <Setter Property="s:RolloverModifier.TooltipTemplate" Value="{StaticResource ChartToolTipTemplate}" />
        <Setter Property="s:RolloverModifier.TooltipContainerStyle" Value="{StaticResource ChartToolTipContainerStyle}" />
        <Setter Property="s:RolloverModifier.IncludeSeries" Value="True" />
        <Setter Property="s:SeriesValueModifier.IncludeSeries" Value="False" />
    </Style>

</UserControl.Resources>