2011-01-26 4 views
2

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

ответ

1

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

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

Edit:

Если вы хотите изменить все остальные точки данных, за исключением точки данных мышь находится над , это немного сложнее и не может быть сделано просто путем рестайлинга элементов управления. Но вы можете создать свой собственный элемент управления серией, который обладает этой возможностью. Вот диаграмма с без стилей колонки серии класса под названием 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; 
    } 
} 

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

+0

Привет, Рик, Большое спасибо за ваш ответ. Тем не менее эффект, который я ищу, несколько отличается. Пожалуйста, проверьте эту ссылку для примера: http://examples.idashboards.com/idashboards/?guestuser=wpsc1. Что происходит, все остальные столбцы исчезают, а сфокусированная колонка остается яркой. Еще раз спасибо за ваш ответ. –

Смежные вопросы