2013-11-26 65 views
0

我想在WPF中創建一個自定義的楔形狀類,派生自抽象Shape類,並且能夠像XAML一樣在任何其他形狀中定義它。從形狀派生的WPF自定義形狀類

我一直在谷歌搜索有關如何做到這一點的完整教程,但我發現的所有東西都是自定義控件。我想要的是創建一個楔形類,使我可以指定內半徑,外半徑,這個楔形體將在360度外的多少個區域(即,如果我想將這些楔形體中的24個圍繞圓形,這個楔形將成爲其中的一個)和它的位置(它將佔據這24個空間中的一個)。這些都是依賴屬性,我已經註冊了它們。

DefiningGeometry屬性調用執行計算點和繪製形狀的所有邏輯的方法。

我遇到的問題是,VS2010自動創建了一個樣式屬性爲「模板」的樣式。然後,當我編譯時,它給了我一個錯誤說:

「錯誤3找不到類型'WpfApplication1.Wedge'的樣式屬性'模板'第8行位置17. C:\ Users \ rflint \ Desktop \ WpfApplication1 \ WpfApplication1 \ Themes \ Generic.xaml 8 17 WpfApplication1「

如果我對此進行評論,所有內容都會編譯,但楔形不會顯示在窗體上。我如何實現這個模板設置屬性?我需要嗎?

XAML:

<my:Wedge CenterPoint="300,300" InnerRadius="100" OuterRadius="200" Sections="12" Position="0" Stroke="Transparent" Fill="#FFCC7329" /> 

C#:

protected override Geometry DefiningGeometry 
{ 
    get 
    { 
    using (StreamGeometryContext context = geometry.Open()) 
    { 
     DrawWedgeGeometry(context); 
    } 

    return geometry; 
    } 
} 

     private void DrawWedgeGeometry(StreamGeometryContext context) 
    { 
     double wedgeAngle = 360/Sections; 
     double angleA = (Position * wedgeAngle) + (wedgeAngle/2); 
     double angleB = (Position * wedgeAngle) - (wedgeAngle/2); 
     Point point1 = getPointOnCircle(CenterPoint, InnerRadius, angleA); 
     Point point2 = getPointOnCircle(CenterPoint, InnerRadius, angleB); 
     Point point3 = getPointOnCircle(CenterPoint, OuterRadius, angleB); 
     Point point4 = getPointOnCircle(CenterPoint, OuterRadius, angleA); 

     Size innerSize = new Size(InnerRadius, InnerRadius); 
     Size outerSize = new Size(OuterRadius, OuterRadius); 

     context.BeginFigure(point1, true, true); 
     context.ArcTo(point2, innerSize, 90, false, SweepDirection.Clockwise, true, true); 
     context.LineTo(point3, true, true); 
     context.ArcTo(point4, outerSize, 90, false, SweepDirection.Counterclockwise, true, true); 
    } 
+1

形狀不是'Control',所以你不會擁有'Template'屬性。你可能沒有設置「Fill」或「Stroke」屬性?發佈XAML讓我們向您展示您如何試圖在屏幕上顯示楔子。 – sthotakura

+0
+0

你也可以發表'DefiningGeometry' ? – sthotakura

回答

0

我只是試圖在VS2012和它工作得很好,至少用一個簡單的橢圓形幾何:

public sealed class Wedge : Shape 
{ 
    public Double Radius 
    { 
     get { return (Double)this.GetValue(RadiusProperty); } 
     set { this.SetValue(RadiusProperty, value); } 
    } 
    public static readonly DependencyProperty RadiusProperty = DependencyProperty.Register(
     "Radius", typeof(Double), typeof(Wedge), new PropertyMetadata(0.0)); 

    protected override Geometry DefiningGeometry 
    { 
     get {return new EllipseGeometry(new Point(0, 0), this.Radius, this.Radius); } 
    } 
} 

和XAML:

<local:Wedge Radius="50" Stroke="Black" Fill="Yellow" StrokeThickness="2" Canvas.Top="100" Canvas.Left="100" /> 
+2

順便說一下,如果你的谷歌「WPF餅圖支持數據綁定」,那麼該項目包含一個名爲「PiePiece」的形狀類,它看起來完全符合你的要求。 –

+0

感謝Mark和sthotakura。我能夠得到它的工作。 – OurManFlint