2017-06-26 10 views
-1

円グラフを描画する私のWPFカスタムコントロールでは、文字列内の値のセットを指定して円グラフを描画することに成功しました。たとえば、「10 20 30」は円グラフを正しい比率で描画します。 DrawingImageの描画プロパティをコンバーターにバインドして、文字列をDrawingGroupに変換しました。これは素晴らしいものでしたが、私はコンバータの必要性を回避しようとしています。ここでWPFコンバータはカスタムコントロールに組み込まれていますか?

は私のメインウィンドウです:ここでは

<Grid Margin="10"> 

    <local:PieChart DrawingCode="289 666 1337 780" Width="400" Height="400" RingWidth="300" Background="White" /> 

</Grid> 

は、カスタムコントロールのための私のテンプレートです:

<Style TargetType="{x:Type local:PieChart}"> 
    <Setter Property="HorizontalContentAlignment" Value="Center" /> 
    <Setter Property="VerticalContentAlignment" Value="Center" /> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type local:PieChart}"> 
       <Grid> 
        <Image Width="{TemplateBinding Width}" Height="{TemplateBinding Height}"> 
         <Image.Source> 
          <DrawingImage Drawing="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=DrawingCode}" /> 
         </Image.Source> 
        </Image> 
        <Ellipse Width="{TemplateBinding RingWidth}" Height="{TemplateBinding RingWidth}" Fill="{TemplateBinding Background}" /> 
       </Grid> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

そして最後に、ここではカスタムコントロールのクラスで私の試みです:

public class PieChart : Control 
{ 
    public static readonly DependencyProperty DrawingCodeProperty = DependencyProperty.Register("DrawingCode", typeof(string), typeof(PieChart), new UIPropertyMetadata(null)); 
    public static readonly DependencyProperty RingWidthProperty = DependencyProperty.Register("RingWidth", typeof(double), typeof(PieChart), new UIPropertyMetadata(null)); 

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

    public string DrawingCode 
    {          
     get { return DrawingCodeConverter((string)GetValue(DrawingCodeProperty)); } 
     set { SetValue(DrawingCodeProperty, value); } 
    } 

    public double RingWidth 
    { 
     get { return (double)GetValue(RingWidthProperty); } 
     set { SetValue(RingWidthProperty, this.Width - value); } 
    } 

    public DrawingGroup DrawingCodeConverter(string value) 
    { 
     // This converter works but is long so I removed it from the post. 
    } 
} 

私は使用しなければならないデータ型のどこかに問題があると確信しています。また、これとはまったく異なる方法がある場合は、私が知らないので、私に知らせてください。 RingWidthは問題ではないことに注意してください。DrawingCodeです。

答えて

1

XAMLまたはBinding、Style Setter、Animationなどでプロパティにアクセスすると、依存関係プロパティのCLRラッパーのゲッターとセッターがバイパスされることがあります。その後、WPFはGetValueとSetValueを直接呼び出します。理由は、XAML Loading and Dependency Properties

で説明されています。したがって、getterおよびsetterのGetValueおよびSetValue以外は呼び出す必要がありません。私は正確にどのように私はこれに結合し、どこがdrawinggroupする文字列から変換するために、PieChartコントロールのロジックを置くべきである上、まだ少し混乱している

public static readonly DependencyProperty DrawingCodeProperty = 
    DependencyProperty.Register(
     "DrawingCode", 
     typeof(string), 
     typeof(PieChart), 
     new FrameworkPropertyMetadata(DrawingCodePropertyChanged)); 

public string DrawingCode 
{ 
    get { return (string)GetValue(DrawingCodeProperty); } 
    set { SetValue(DrawingCodeProperty, value); } 
} 

private static void DrawingCodePropertyChanged(
    DependencyObject o, DependencyPropertyChangedEventArgs e) 
{ 
    var pieChart = (PieChart)o; 
    pieChart.SetDrawingCode((string)e.NewValue); 
} 

private void SetDrawingCode(string drawingCode) 
{ 
    var drawingGroup = DrawingCodeConverter(drawingCode); 
    // do something with drawingGroup 
} 
+0

:代わりに、このようなPropertyChangedCallbackであなたの依存関係プロパティを宣言。ありがとう! –

+0

文字列を描画グループに変換するためのコードをprivate void SetDrawingCode() { // Put Instance DrawingCodeプロパティ変更されたコードはここに DrawingCodeConverter(DrawingCode); } –

+0

例では、DrawingCodeConverter(DrawingCode)を配置しますが、私のメソッドは文字列からDrawingGroupを返します。 SetDrawingCode()メソッドでDrawingGroupを取得した場合、その後に何をすればよいですか?すべての質問を申し訳ありませんが、私はちょうどこの周りに私の頭をラップするのに苦労しています –

関連する問題