Search code examples
uwpwinrt-xamlwinrt-xaml-toolkit

How to make changes on LineChart


I tried below and it is not working.

<Charting:LineSeries Title="Line_1" Margin="0" 
FontSize="30" Tapped="LineSeries_Tapped" 
FontWeight="SemiBold"   BorderBrush="Red"  
IndependentValuePath="interval" 
DependentValuePath="size" IsSelectionEnabled="True">

 </Charting:Chart>

How to

1) change the fontsize for the IndependentValuePath and DependentValuePath? The above is not working.
2) Change the color of the IndependentValuePath and DependentValuePath? The above is not working.
3) How to get the value of the IndependentValuePath and DependentValuePath when the line or point of line chart is touched?

------- Edit_2

I combine both styles you have provided:

<Charting:Chart 
x:Name="LineChart" Grid.Column="1" FontSize="16" VerticalAlignment="Top" 
HorizontalAlignment="Left" Margin="94,27,0,0" 
FontWeight="SemiBold"  Width="651" Height="506">

<Charting:LineSeries 
Title="Station1" Margin="0" FontSize="16" Foreground="Blue" FontWeight="SemiBold" IndependentValuePath="Q_interval" DependentValuePath="Q_size" IsSelectionEnabled="True">

<Charting:LineSeries.Style>

(1)
  <Style TargetType="Charting:LineSeries">

      <Setter Property="IsTabStop" Value="False" />
      <Setter Property="PolylineStyle">
          <Setter.Value>
             <Style TargetType="Polyline">
             <Setter Property="StrokeThickness" Value="3" />
             <Setter Property="StrokeMiterLimit" Value="1" />
             </Style>
          </Setter.Value>
      </Setter>

      <Setter Property="Template">
         <Setter.Value>
         <ControlTemplate TargetType="Charting:LineSeries">
            <Canvas x:Name="PlotArea">
               <Polyline
                   Style="{TemplateBinding PolylineStyle}"
                            Stroke="Blue"
                            Points="{TemplateBinding Points}" />
             </Canvas>
         </ControlTemplate>
        </Setter.Value>
      </Setter>
   </Style>                    
</Charting:LineSeries.Style>

(2)

<Charting:LineSeries.DataPointStyle>                        
<Style TargetType="Charting:LineDataPoint">                            
    <Setter Property="Width" Value="20" />
    <Setter Property="Height" Value="20" />
    <Setter Property="Background" Value="Blue"/>
    <Setter Property="FontWeight" Value="SemiBold"/>
 </Style>
</Charting:LineSeries.DataPointStyle>

</Charting:LineSeries>              

</Charting:Chart>

with (1) and (2) I got the Dot and the stroke.

Thanks


Solution

  • Firstly, for LineSeries element, the two properties you want to change style are DependentValueBinding and IndependentValueBinding.

    1) change the fontsize for the IndependentValuePath and DependentValuePath? The above is not working.

    For IndependentValueBinding property's style, it is defined by LineSeries parent element Chart, so directly set the fontsize property for the LineSeris element will take no effect. Set the Fontsize for the chart element will work.

    <charting:Chart
       x:Name="LineChart"
       Title="Line Chart"
       Margin="70,0" 
       FontSize="30">
    

    For DependentValueBinding property, it is actually a PolyLine, doesn't have FontSize property.

    2) Change the color of the IndependentValuePath and DependentValuePath? The above is not working.

    For the color of IndependentValueBinding, it is same with fontsize property, just set Foreground property for the Chart element. For the color of DependentValueBinding, it should change the color of PolyLine which is in ControlTemplate of LineSeries. Change the Stroke property of PolyLine will work.

    <charting:LineSeries.Style>
        <Style TargetType="charting:LineSeries">
            <Setter Property="IsTabStop" Value="False" />
            <Setter Property="PolylineStyle">
                <Setter.Value>
                    <Style TargetType="Polyline">
                        <Setter Property="StrokeThickness" Value="10" />
                        <Setter Property="StrokeMiterLimit" Value="1" />
                    </Style>
                </Setter.Value>
            </Setter>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="charting:LineSeries">
                        <Canvas x:Name="PlotArea">
                            <Polyline
                                Style="{TemplateBinding PolylineStyle}"
                                Stroke="Red"
                                Points="{TemplateBinding Points}" />
                        </Canvas>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </charting:LineSeries.Style>
    

    3) How to get the value of the IndependentValuePath and DependentValuePath when the line or point of line chart is touched?

    In the tapped event, get the selected item and get the value you bind to the IndependentValueBinding and DependentValueBinding properties.

    if (line1.SelectedItem != null)
    {
        NameValueItem seleteditem = line1.SelectedItem as NameValueItem;
        System.Diagnostics.Debug.WriteLine(seleteditem.Name);
        System.Diagnostics.Debug.WriteLine(seleteditem.Value);
    }
    

    Here is the complete code contain features you want above, please try to set the properties as I mentioned above.

    Xaml Code

    <charting:Chart
        x:Name="LineChart"
        Title="Line Chart"
        Margin="70,0"
        Foreground="Red"
        FontSize="30">
        <charting:LineSeries
            x:Name="line1"
            Title="Population in 2005"
            DependentValueBinding="{Binding Value}"
            IndependentValueBinding="{Binding Name}"
            IsSelectionEnabled="True"
            Tapped="LineSeries_Tapped">
            <charting:LineSeries.Style>
                <Style TargetType="charting:LineSeries">
                    <Setter Property="IsTabStop" Value="False" />
                    <Setter Property="PolylineStyle">
                        <Setter.Value>
                            <Style TargetType="Polyline">
                                <Setter Property="StrokeThickness" Value="10" />
                                <Setter Property="StrokeMiterLimit" Value="1" />
                            </Style>
                        </Setter.Value>
                    </Setter>
                    <Setter Property="Template">
                        <Setter.Value>
                            <ControlTemplate TargetType="charting:LineSeries">
                                <Canvas x:Name="PlotArea">
                                    <Polyline
                                        Style="{TemplateBinding PolylineStyle}"
                                        Stroke="Red"
                                        Points="{TemplateBinding Points}" />
                                </Canvas>
                            </ControlTemplate>
                        </Setter.Value>
                    </Setter>
                </Style>
            </charting:LineSeries.Style>
        </charting:LineSeries>     
    </charting:Chart>
    

    Code behind

    public sealed partial class MainPage : Page
    {
        private Random _random = new Random();
        public MainPage()
        {
            this.InitializeComponent();
            var items1 = new List<NameValueItem>();
            var items2 = new List<NameValueItem>();
            var items3 = new List<NameValueItem>();
            for (int i = 0; i < 3; i++)
            {
                items1.Add(new NameValueItem { Name = "Name" + i, Value = _random.Next(10, 100) });   
            }
            this.RunIfSelected(this.LineChart, () => ((LineSeries)this.LineChart.Series[0]).ItemsSource = items1);     
    
        }
    
    
        private void RunIfSelected(UIElement element, Action action)
        {
            action.Invoke();
        }
    
        private void LineSeries_Tapped(object sender, TappedRoutedEventArgs e)
        {
            if (line1.SelectedItem != null)
            {
                NameValueItem seleteditem = line1.SelectedItem as NameValueItem;
                System.Diagnostics.Debug.WriteLine(seleteditem.Name);
                System.Diagnostics.Debug.WriteLine(seleteditem.Value);
            }
    
        }
    }
    public class NameValueItem
    {
        public string Name { get; set; }
        public int Value { get; set; }
    }