Wpf Toolkit Chart Invert Highlighting - PullRequest
       6

Wpf Toolkit Chart Invert Highlighting

2 голосов
/ 26 января 2011

Как выделить другие фигуры (столбцы, столбцы и т. Д.) На диаграмме, созданной с помощью инструментария wpf. Я использую шаблон элемента управления для стилизации своего собственного графика. До сих пор я использовал триггер, чтобы получить эффект затухания элемента, на котором находится мышь. Я хочу перевернуть это; затухание других элементов (популярный визуальный трюк с графиками), на которые не указывает мышь. На следующем рисунке показан выбранный столбец Faded, я хочу, чтобы он был наоборот column faded.

1 Ответ

1 голос
/ 26 января 2011

Просто установите значение по умолчанию на блеклое и используйте триггер, чтобы довести его до полной непрозрачности.Вы выполнили некоторые другие стили, но вот пример, основанный на стиле по умолчанию:

<Grid>
    <Grid.Resources>
        <PointCollection x:Key="sampleData">
            <Point>1,20</Point>
            <Point>2,40</Point>
            <Point>3,30</Point>
        </PointCollection>
        <Style x:Key="dimEffectStyle" TargetType="{x:Type charting:ColumnDataPoint}" BasedOn="{StaticResource {x:Type charting:ColumnDataPoint}}">
            <Setter Property="Opacity" Value="0.25"/>
            <Style.Triggers>
                <Trigger Property="IsMouseOver" Value="True">
                    <Trigger.EnterActions>
                        <BeginStoryboard>
                            <Storyboard>
                                <DoubleAnimation Storyboard.TargetProperty="Opacity" To="1" Duration="0:0:0.1" />
                            </Storyboard>
                        </BeginStoryboard>
                    </Trigger.EnterActions>
                    <Trigger.ExitActions>
                        <BeginStoryboard>
                            <Storyboard>
                                <DoubleAnimation Storyboard.TargetProperty="Opacity" To="0.25" Duration="0:0:0.1" />
                            </Storyboard>
                        </BeginStoryboard>
                    </Trigger.ExitActions>
                </Trigger>
            </Style.Triggers>
        </Style>
    </Grid.Resources>
    <charting:Chart>
        <charting:ColumnSeries
            Title="A"
            ItemsSource="{StaticResource sampleData}"
            IndependentValueBinding="{Binding X}"
            DependentValueBinding="{Binding Y}"
            DataPointStyle="{StaticResource dimEffectStyle}"
            />
    </charting:Chart>
</Grid>

Редактировать:

Если вы хотите изменить все остальные точки данныхкроме точки данных, на которой находится мышь, это немного сложнее и не может быть сделано простым рестайлингом элементов управления.Но вы можете создать свой собственный контроль серии, который имеет эту возможность.Вот диаграмма с классом столбцов без стиля с именем MouseNotOverColumnSeries с новым свойством MouseNotOverOpacity:

    <Grid.Resources>
        <PointCollection x:Key="sampleData">
            <Point>1,20</Point>
            <Point>2,40</Point>
            <Point>3,30</Point>
        </PointCollection>
    </Grid.Resources>
    <charting:Chart Name="chart1">
        <local:MouseNotOverColumnSeries
            Title="A"
            ItemsSource="{StaticResource sampleData}"
            IndependentValueBinding="{Binding X}"
            DependentValueBinding="{Binding Y}"
            MouseNotOverOpacity="0.5"
            />
    </charting:Chart>

Вот класс MouseNotOverColumnSeries:

public class MouseNotOverColumnSeries : ColumnSeries
{
    public double MouseNotOverOpacity { get; set; }

    protected override void OnDataPointsChanged(IList<DataPoint> newDataPoints, IList<DataPoint> oldDataPoints)
    {
        base.OnDataPointsChanged(newDataPoints, oldDataPoints);
        foreach (var dataPoint in oldDataPoints)
        {
            dataPoint.MouseEnter -= new MouseEventHandler(dataPoint_MouseEnter);
            dataPoint.MouseLeave -= new MouseEventHandler(dataPoint_MouseLeave);
        }
        foreach (var dataPoint in newDataPoints)
        {
            dataPoint.MouseEnter += new MouseEventHandler(dataPoint_MouseEnter);
            dataPoint.MouseLeave += new MouseEventHandler(dataPoint_MouseLeave);
        }
    }

    void dataPoint_MouseEnter(object sender, System.Windows.Input.MouseEventArgs e)
    {
        foreach (var dataPoint in ActiveDataPoints)
            if (e.OriginalSource != dataPoint) dataPoint.Opacity = MouseNotOverOpacity;
    }

    void dataPoint_MouseLeave(object sender, System.Windows.Input.MouseEventArgs e)
    {
        foreach (var dataPoint in ActiveDataPoints)
            dataPoint.Opacity = 1;
    }
}

Мы простообратите внимание на то, когда точки данных меняются, и регистрируйте обработчики ввода / вывода мыши, которые манипулируют непрозрачностью всех других точек данных, над которыми мышь не находится.Это можно расширить для поддержки раскадровок и т. Д.

...