Привязка пользовательской подсказки диаграммы WPF - PullRequest
1 голос
/ 03 апреля 2012

У меня есть диаграмма WPF, к которой я динамически привязываю BarSeries.Однако я бы хотел, чтобы BarSeries показывал 3 фрагмента информации.Третий фрагмент информации, который я хотел бы показать во всплывающей подсказке любого данного элемента данных.

Есть ли способ динамического связывания значения / содержимого всплывающей подсказки для данного элемента данных в моих сериях?

XAML:

<UserControl.Resources>
    <Style
       x:Key="SimpleDataPointStyle"
       BasedOn="{StaticResource {x:Type chartingToolkit:BarDataPoint}}"
       TargetType="{x:Type chartingToolkit:BarDataPoint}">
        <Setter Property="Width" Value="20"/>
        <Setter Property="Height" Value="20"/>
        <Setter x:Name="DataPointToolTip" Property="ToolTip" Value="{Binding Path=Event_Description}"/>
    </Style>
</UserControl.Resources>
<Grid x:Name="MetricsPanel" Width="904" Height="376" HorizontalAlignment="Left" VerticalAlignment="Top">   
    <chartingToolkit:Chart x:Name="MetricChart" HorizontalAlignment="Left" Width="464" Height="352" VerticalAlignment="Top">
        <chartingToolkit:Chart.Series>
            <chartingToolkit:BarSeries x:Name="MainSeries"
                                       Title="Contribution to Risk and Errors (%)"
                                       IndependentValueBinding="{Binding}"
                                       DependentValueBinding="{Binding}">
                <chartingToolkit:BarSeries.DataPointStyle>
                    <Style
                        BasedOn="{StaticResource SimpleDataPointStyle}"
                        TargetType="{x:Type chartingToolkit:BarDataPoint}">  
                    </Style>
                </chartingToolkit:BarSeries.DataPointStyle>

            </chartingToolkit:BarSeries>
        </chartingToolkit:Chart.Series>
    </chartingToolkit:Chart>

Code-Behind

самая высокаяWeightedEvents = BuildHighestWeightedEventsTable ();

        MainSeries.DependentValueBinding = new Binding("Cutset_Frequency");
        MainSeries.IndependentValueBinding = new Binding("Event_Number");
        MainSeries.ItemsSource = highestWeightedEvents.DefaultView;
        Style dataPointStyle = (Style)Resources["SimpleDataPointStyle"];
        MainSeries.DataPointStyle = dataPointStyle;

Как указать привязку для всплывающей подсказки в кодепозади?

Спасибо заранее ...

Ответы [ 2 ]

1 голос
/ 03 апреля 2012

Я фактически решил свою проблему вчера вечером, полностью переопределив шаблон для BarDataPoint.

Стиль XAML:

<Style x:Key="NewDataPointStyle" TargetType="chartingToolkit:BarDataPoint">
<Setter Property="Background" Value="SteelBlue" />
<Setter Property="IsTabStop" Value="False" />
<Setter Property="BorderBrush" Value="#FF686868" />
<Setter Property="Width" Value="20" />
<Setter Property="Height" Value="20" />
<Setter Property="Template">
    <Setter.Value>
        <ControlTemplate TargetType="chartingToolkit:BarDataPoint">
            <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>
                                <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Duration="00:00:00.0010000" Storyboard.TargetName="MouseOverHighlight" Storyboard.TargetProperty="(UIElement.Opacity)">
                                    <SplineDoubleKeyFrame KeyTime="00:00:00" Value="0.3" />
                                </DoubleAnimationUsingKeyFrames>
                            </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>
                                <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Duration="00:00:00.0010000" Storyboard.TargetName="SelectionHighlight" Storyboard.TargetProperty="(UIElement.Opacity)">
                                    <SplineDoubleKeyFrame KeyTime="00:00:00" Value="0.185" />
                                </DoubleAnimationUsingKeyFrames>
                                <ColorAnimationUsingKeyFrames BeginTime="00:00:00" Duration="00:00:00.0010000" Storyboard.TargetName="SelectionHighlight" Storyboard.TargetProperty="(Shape.Fill).(SolidColorBrush.Color)">
                                    <SplineColorKeyFrame KeyTime="00:00:00" Value="#FF8A8A8A" />
                                </ColorAnimationUsingKeyFrames>
                            </Storyboard>
                        </VisualState>
                    </VisualStateGroup>
                    <VisualStateGroup x:Name="RevealStates">
                        <VisualStateGroup.Transitions>
                            <VisualTransition GeneratedDuration="0:0:0.5" />
                        </VisualStateGroup.Transitions>
                        <VisualState x:Name="Shown">
                            <Storyboard>
                                <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Duration="00:00:00.0010000" Storyboard.TargetName="Root" Storyboard.TargetProperty="(UIElement.Opacity)">
                                    <SplineDoubleKeyFrame KeyTime="00:00:00" Value="1" />
                                </DoubleAnimationUsingKeyFrames>
                            </Storyboard>
                        </VisualState>
                        <VisualState x:Name="Hidden">
                            <Storyboard>
                                <DoubleAnimation Duration="0" Storyboard.TargetName="Root" Storyboard.TargetProperty="Opacity" To="0" />
                            </Storyboard>
                        </VisualState>
                    </VisualStateGroup>
                </VisualStateManager.VisualStateGroups>
                <ToolTipService.ToolTip>
                    <ContentControl Content="{Binding Path=Event_Description}" />
                </ToolTipService.ToolTip>
                        <StackPanel Orientation="Horizontal"
                                Background="{TemplateBinding Background}">
                        </StackPanel>
                </Grid>
        </ControlTemplate>
    </Setter.Value>
</Setter>

Диаграмма XAML:

<chartingToolkit:Chart x:Name="MetricChart" HorizontalAlignment="Left" Width="464" Height="352" VerticalAlignment="Top">
        <chartingToolkit:Chart.Axes>
            <chartingToolkit:LinearAxis Interval="10" Maximum="100" x:Name="XAxis" Orientation="X" Title="Percent Contribution (%)"/>
            <chartingToolkit:CategoryAxis Title="Event Number" Orientation="Y"/>
        </chartingToolkit:Chart.Axes>
        <chartingToolkit:Chart.Series>
            <chartingToolkit:BarSeries x:Name="MainSeries"
                                       Title="Contribution to Risk and Errors (%)"
                                       IndependentValueBinding="{Binding}"
                                       DependentValueBinding="{Binding}" BorderThickness="0" BorderBrush="Black" Background="Black" OpacityMask="Black">
                <chartingToolkit:BarSeries.DataPointStyle>
                    <Style
                        BasedOn="{StaticResource NewDataPointStyle}"
                        TargetType="{x:Type chartingToolkit:BarDataPoint}">
                    </Style>
                </chartingToolkit:BarSeries.DataPointStyle>
            </chartingToolkit:BarSeries>
        </chartingToolkit:Chart.Series>
        <chartingToolkit:Chart.LegendStyle>
            <Style TargetType="Control">
                <Setter Property="Width" Value="0"/>
                <Setter Property="Height" Value="0"/>
            </Style>
        </chartingToolkit:Chart.LegendStyle>
    </chartingToolkit:Chart>

Code-Behind:

        //highestWeightedEvents is a DataTable
        highestWeightedEvents = BuildHighestWeightedEventsTable();
        MainSeries.DependentValueBinding = new Binding("Cutset_Frequency");
        MainSeries.IndependentValueBinding = new Binding("Event_Number");
        MainSeries.ItemsSource = highestWeightedEvents.DefaultView;

Так как я определяю DataSeries.ItemsSource в коде позади, привязка ToolTip знает, где искать.Я надеюсь, что кто-то еще может извлечь выгоду из этого, поскольку я потратил целый день, выясняя это: D

0 голосов
/ 03 апреля 2012

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

//your code behind
        Style newDataPointStyle = (Style)Resources["SimpleDataPointStyle"];

        newDataPointStyle.Setters.Add(
            new Setter
            {
                Property = "ToolTip",
                Value = new Binding("YourBinding")
            });
        MainSeries.DataPointStyle = newDataPointStyle;
...