2017-12-27 15 views

答えて

0

ラベルを管理するプロパティがないため、System.Windows.Controls.DataVisualization.Charting PieChartにパーセンテージを追加することはそれほど迅速ではありません。

いずれにしても、目標に到達する方法はいくつかあります。私はarticle on my blogを書いて、私が使ったものを記述しました。あなたは、元のGeometryには(パーセントで)FormattedTextジオメトリを追加して見ることができるように

public class PieDataPoint : System.Windows.Controls.DataVisualization.Charting.PieDataPoint 
{ 
    public static readonly DependencyProperty TextedGeometryProperty = 
     DependencyProperty.Register("TextedGeometry", typeof(Geometry), typeof(PieDataPoint)); 

    public Geometry TextedGeometry 
    { 
     get { return (Geometry)GetValue(TextedGeometryProperty); } 
     set { SetValue(TextedGeometryProperty, value); } 
    } 

    static PieDataPoint() 
    { 
     DefaultStyleKeyProperty.OverrideMetadata(typeof(PieDataPoint), 
      new FrameworkPropertyMetadata(typeof(PieDataPoint))); 
    } 

    public PieDataPoint() 
    { 
     DependencyPropertyDescriptor dependencyPropertyDescriptor 
      = DependencyPropertyDescriptor.FromProperty(GeometryProperty, GetType()); 

     dependencyPropertyDescriptor.AddValueChanged(this, OnGeometryValueChanged); 
    } 

    private double LabelFontSize 
    { 
     get 
     { 
      FrameworkElement parentFrameworkElement = Parent as FrameworkElement; 
      return Math.Max(8, Math.Min(parentFrameworkElement.ActualWidth, 
       parentFrameworkElement.ActualHeight)/30); 
     } 
    } 

    private void OnGeometryValueChanged(object sender, EventArgs arg) 
    { 
     Point point; 
     FormattedText formattedText; 

     CombinedGeometry combinedGeometry = new CombinedGeometry(); 
     combinedGeometry.GeometryCombineMode = GeometryCombineMode.Exclude; 

     formattedText = new FormattedText(FormattedRatio, 
      CultureInfo.CurrentCulture, 
      FlowDirection.LeftToRight, 
      new Typeface("Arial"), 
      LabelFontSize, 
      Brushes.White); 

     if (ActualRatio == 1) 
     { 
      EllipseGeometry ellipseGeometry = Geometry as EllipseGeometry; 

      point = new Point(ellipseGeometry.Center.X - formattedText.Width/2, 
       ellipseGeometry.Center.Y - formattedText.Height/2); 
     } 
     else if (ActualRatio == 0) 
     { 
      TextedGeometry = null; 
      return; 
     } 
     else 
     { 
      Point tangent; 
      Point half; 
      Point origin; 

      PathGeometry pathGeometry = Geometry as PathGeometry; 
      pathGeometry.GetPointAtFractionLength(.5, out half, out tangent); 
      pathGeometry.GetPointAtFractionLength(0, out origin, out tangent); 

      point = new Point(origin.X + ((half.X - origin.X)/2) - formattedText.Width/2, 
       origin.Y + ((half.Y - origin.Y)/2) - formattedText.Height/2); 

     } 

     combinedGeometry.Geometry1 = Geometry; 
     combinedGeometry.Geometry2 = formattedText.BuildGeometry(point); 

     TextedGeometry = combinedGeometry; 
    } 
} 

最初のステップは、カスタムPieDataPointクラスを作成することです。次に、新しいジオメトリプロパティ(TextedGeometry)を使用するためのデフォルトスタイル(generic.xaml辞書内)を作成する必要があります。

<Path Name="Slice" Data="{TemplateBinding local:PieDataPoint.TextedGeometry}" 
      Fill="{TemplateBinding Control.Background}" 
      Stroke="{TemplateBinding Control.BorderBrush}" 
      StrokeMiterLimit="1"> 
    <ToolTipService.ToolTip> 
     <StackPanel> 
      <ContentControl Content="{TemplateBinding chartingToolkit:DataPoint.FormattedDependentValue}" /> 
      <ContentControl Content="{TemplateBinding chartingToolkit:PieDataPoint.FormattedRatio}" /> 
     </StackPanel> 
    </ToolTipService.ToolTip> 
</Path> 

あなたは「スライス」パスがTextedGeometryにバインドさそのData性質を持って見ることができるように: - 少なくとも - そのような何かを

スタイルが含まれている必要があります。

今すぐカスタム PieSeriesで私たちが使用する Chart制御を強制することができ、当社の PieDataPoint
public class PieSeries : System.Windows.Controls.DataVisualization.Charting.PieSeries 
{ 
    protected override DataPoint CreateDataPoint() 
    { 
     return new PieDataPoint(); 
    } 
} 

はので、あなたのXAMLで使用することができます: localは、カスタム名前空間を参照し

<chartingToolkit:Chart Name="pieChart" Title="Pie Series Demo"> 
    <local:PieSeries DependentValuePath="Value" IndependentValuePath="Key" 
         ItemsSource="{Binding}" IsSelectionEnabled="True" /> 

</chartingToolkit:Chart> 

。それがあなたを助けることを願っています。

+0

非常に詳細な回答ありがとうございます。 –

+0

@NguyenMinhDat歓迎ですが、私の答えがあなたの質問に合っていると思うなら、それを正解とマークしてください –

関連する問題