【问题标题】:DataTemplate for RolloverModifier on SciChart when RenderableSeries is bound to MVVM当 RenderableSeries 绑定到 MVVM 时,SciChart 上 RolloverModifier 的 DataTemplate
【发布时间】:2017-04-24 23:47:32
【问题描述】:

我正在尝试自定义出现在 SciChart 折线图上的 RolloverModifier 工具提示的外观,使用 DataTemplate(结合 RolloverModifierTooltipTemplate 属性,但无法弄清楚.

这是我的DataTemplate,为了让它正常工作,我尽可能地简化了它。

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

到目前为止我所做的尝试:

第一:

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

但我得到了错误:

无法将“SciChart.Charting.ChartModifiers.RolloverModifier”类型的对象转换为“SciChart.Charting.Visuals.RenderableSeries.BaseRenderableSeries”类型。

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

<s:SciChartSurface.RenderableSeries>
    <s:FastLineRenderableSeries  s:TooltipModifier.TooltipTemplate="{StaticResource TooltipTemplate}" 
                                s:TooltipModifier.IncludeSeries="True"
                                s:SeriesValueModifier.IncludeSeries="False"/>
</s:SciChartSurface.RenderableSeries>

但是,这对我没有好处,因为我的 RenderableSeries 绑定到我的 ViewModel 中的 ObservableCollection&lt;IRenderableSeries&gt;

<s:SciChartSurface
    x:Name="SciChart"
    Grid.Column="0"
    Annotations="{Binding Annotations}"
    GridLinesPanelStyle="{StaticResource GridLinesPanelStyle}"
    RenderableSeries="{Binding ChartSeries}"
    Style="{StaticResource SurfaceStyle}">

关于类似问题的建议是使用ObservableCollection&lt;IRenderableSeriesViewModel&gt; 并根据文档中的此页面设置 ViewModel 中的样式:Bind Tooltip Templates or Attached Properties in MVVM,但我不知道如何转换我的IRenderableSeriesLineRenderableSeriesViewModel 并最终得到一个空白图表。

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

    <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>

但是样式对工具提示完全没有影响(即使是我刚刚放入以检查它是否有效的FontSize 位)。删除该行会完全删除工具提示。

【问题讨论】:

  • 如果您需要任何帮助,请提供一个最小、完整且可验证的问题示例:stackoverflow.com/help/mcve
  • LineRenderableSeriesViewModel 是 IRenderableSeriesViewModel,因此您应该简单地绑定到 ObservableCollection 而不是 ObservableCollection
  • @mm8 是,如果 OP 正在使用 SeriesBinding 标记扩展。从代码示例来看,他不是。

标签: wpf xaml mvvm scichart


【解决方案1】:

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

基本上问题在于,在 SciChart WPF 库中,BaseRenderableSeriesFastLineRenderableSeries 已经有默认样式(没有 x:key 的样式),因此要隐式覆盖它,您必须将类型设置为等于系列类型。覆盖基础不起作用。

以下代码确实有效。放置在 Window.Resources 中,它对SciChartSurface 中的所有FastLineRenderableSeries 应用红色描边和描边粗细为5:

<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>

您需要为您希望为其设置默认工具提示的所有系列类型添加一个样式,并且此样式将应用于所有这些类型。

【讨论】:

    【解决方案2】:

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

    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>
    

    【讨论】:

    • 它的 StyleKey 位就是关键。在文档中的任何地方都没有发现
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-11
    • 1970-01-01
    • 2013-10-23
    相关资源
    最近更新 更多