WedX - журнал о программировании и компьютерных науках

DataTemplate для RolloverModifier в SciChart, когда RenderableSeries привязан к MVVM

Я пытаюсь настроить внешний вид всплывающих подсказок RolloverModifier, которые появляются на линейной диаграмме SciChart, используя DataTemplate (в сочетании с атрибутом TooltipTemplate атрибута RolloverModifier, но не могу понять это.

Вот мой 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 привязан к ObservableCollection<IRenderableSeries> в моей ViewModel.

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

Предложение по аналогичному вопросу заключалось в том, чтобы использовать ObservableCollection<IRenderableSeriesViewModel> и установить стиль в ViewModel в соответствии с этой страницей в документации: Привязать шаблоны всплывающей подсказки или присоединенные свойства в MVVM, но я не смог понять как преобразовать мой IRenderableSeries в LineRenderableSeriesViewModel и получил пустую диаграмму.

Другое предложение в этом похожем вопросе (SciChart: Custom RolloverModifierLabel для нескольких DataSeries связанный с кодом должен был использовать неявный стиль, поэтому я добавил

    <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, который я только что вставил, чтобы проверить, работает ли он вообще). Удаление этой строки полностью удаляет всплывающие подсказки.

20.04.2017

  • Если вам нужна помощь, предоставьте минимальный, полный и проверяемый пример вашей проблемы: stackoverflow.com/help/mcve 21.04.2017
  • LineRenderableSeriesViewModel — это IRenderableSeriesViewModel, поэтому вам следует просто выполнить привязку к ObservableCollection‹IRenderableSeriesViewModel› вместо ObservableCollection‹IRenderableSeries›. 21.04.2017
  • @ mm8 да, если OP использует расширение разметки SeriesBinding. Судя по образцу кода, это не так. 24.04.2017

Ответы:


1

Я немного покопался для вас, так как этот вопрос часто задают.

В основном проблема заключается в том, что в библиотеке SciChart WPF BaseRenderableSeries и FastLineRenderableSeries уже имеет стиль по умолчанию (стиль без ключа x:), поэтому, чтобы неявно переопределить его, вы должны установить тип, равный типу серии. Перепрошивка базы не работает.

Следующий код работает. Помещенный в Window.Resources, он применяет красную обводку и толщину обводки 5 ко всем FastLineRenderableSeries в SciChartSurface:

<Window x:Class="WpfApplication3.MainWindow"
        xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:s="https://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>

введите здесь описание изображения

Вам нужно будет добавить стиль для всех типов серий, для которых вы хотите установить всплывающую подсказку по умолчанию, и этот стиль будет применяться ко всем им.

24.04.2017

2

В конце концов я заставил метод MVVM работать. Согласно комментарию mm8, я уже был привязан к ObservableCollection<IRenderableSeriesViewModel>, однако я пытался скопировать в него свой ObservableCollection<IRenderableSeries>, поэтому я изменил его, чтобы просто построить первый с нуля.

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

Затем в XAML...

(Частично благодаря SciChart, эта страница: Пользовательская всплывающая подсказка WPF Chart Пример шаблона)

<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>
24.04.2017
  • это тот бит StyleKey, который является ключом. нигде в документации этого не заметил 12.12.2019
  • Новые материалы

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..


    Для любых предложений по сайту: [email protected]