C# WPF中的填充弧

C# WPF中的填充弧,c#,wpf,geometry,C#,Wpf,Geometry,我试图画一个这样的数字: new LineSegment(new Point(x2, y2), true), new ArcSegment(new Point(x3,y3),new Size(100*outerRadius,100*outerRadius), 0,largeAngle, SweepDirection.Clockwise, true), new LineSegment(new Point(x4, y4), true), new ArcSegment(new Point(x1, y1

我试图画一个这样的数字:

new LineSegment(new Point(x2, y2), true),
new ArcSegment(new Point(x3,y3),new Size(100*outerRadius,100*outerRadius), 0,largeAngle, SweepDirection.Clockwise, true),
new LineSegment(new Point(x4, y4), true),
new ArcSegment(new Point(x1, y1),new Size(100*innerRadius,100*innerRadius), 0,largeAngle, SweepDirection.Counterclockwise, true),
我需要每个弧段都有一个唯一的元素,我可以根据需要处理事件和重新调用。我有点不确定如何在WPF中创建正确的几何图形。我可以根据圆的半径和与中心的角度轻松计算每个弧段的四个点。外圆半径为100,内圆半径为50,红色的四个点为(从左上角顺时针方向,原点位于圆的顶部):

使用这些点,我创建了一个简单的路径来绘制线段:


但这只是画了一个有直线的梯形。我知道我可以改变弧段的大小,但我似乎不知道这是如何影响曲率的。我希望弧线跟随主圆,但我不知道如何表达。如何使圆弧具有正确的曲率


另外,如何在c#code behind中表示和添加路径,而不是在xaml中?

我画的正是这种形状(两个同轴弧和两个连接它们的半径),如下所示:

new LineSegment(new Point(x2, y2), true),
new ArcSegment(new Point(x3,y3),new Size(100*outerRadius,100*outerRadius), 0,largeAngle, SweepDirection.Clockwise, true),
new LineSegment(new Point(x4, y4), true),
new ArcSegment(new Point(x1, y1),new Size(100*innerRadius,100*innerRadius), 0,largeAngle, SweepDirection.Counterclockwise, true),

显然,这是代码而不是XAML,但它可能会给您一个好的开始。

另外一个选项是将expression 2010绘图命名空间拉入XAML。那就容易了

<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:ed="http://schemas.microsoft.com/expression/2010/drawing" x:Class="Arcs.MainWindow"
    Title="MainWindow" Height="350" Width="525">
<Grid>
    <ed:Arc ArcThickness="30"
            ArcThicknessUnit="Pixel"
            StartAngle="30"
            EndAngle="130"
            HorizontalAlignment="Left"
            Height="179" Margin="195,62,0,0"
            Stretch="None"
            Stroke="CornflowerBlue"
            Fill ="CornflowerBlue"
            VerticalAlignment="Top"
            Width="179" />
</Grid>


编辑:这将拉入“Microsoft.Expression.Drawing”,在安装Blend时安装该文件。如果客户端计算机没有此功能,则此功能将失败。另一方面,您可以使用软件打包和重新分发dll。微软允许这样做。

XAML代码

<Window x:Class="PopupTargetElement.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:ed="http://schemas.microsoft.com/expression/2010/drawing"         
        mc:Ignorable="d" Title="MainWindow" Height="450" Width="800">        
    <Grid>
        <ed:Arc ArcThickness="40" ArcThicknessUnit="Pixel" EndAngle="360" Fill="#FFF4F4F5" HorizontalAlignment="Center" Height="300"
                Stretch="None" Stroke="Black" StartAngle="0" VerticalAlignment="Center" Width="300"/>

        <ed:Arc ArcThickness="40" ArcThicknessUnit="Pixel" EndAngle="360" Fill="#FFF4F4F5" HorizontalAlignment="Center" Height="220"
            Stretch="None" Stroke="Black" StartAngle="0" VerticalAlignment="Center" Width="220"/>
        
        <Ellipse   Width="140"  Height="140" Fill="Black" Stroke="Black" StrokeThickness="1" />

        <ed:Arc ArcThickness="40" ArcThicknessUnit="Pixel" EndAngle="45" Fill="Black" HorizontalAlignment="Center" Height="300" 
            Stretch="None" Stroke="Black" StartAngle="0" VerticalAlignment="Center" Width="300"/>

        <ed:Arc ArcThickness="40" ArcThicknessUnit="Pixel" EndAngle="135" Fill="Black" HorizontalAlignment="Center" Height="300"
            Stretch="None" Stroke="Black" StartAngle="90" VerticalAlignment="Center" Width="300"/>

        <ed:Arc ArcThickness="40" ArcThicknessUnit="Pixel"  EndAngle="225" Fill="Black" HorizontalAlignment="Center" Height="300" 
            Stretch="None" Stroke="Black" StartAngle="180" VerticalAlignment="Center" Width="300"/>

        <ed:Arc ArcThickness="40" ArcThicknessUnit="Pixel"  EndAngle="315" Fill="Black" HorizontalAlignment="Center" Height="300"
            Stretch="None" Stroke="Black" StartAngle="270" VerticalAlignment="Center" Width="300"/>

        <ed:Arc ArcThickness="40" ArcThicknessUnit="Pixel" EndAngle="90" Fill="Black" HorizontalAlignment="Center" Height="220" 
            Stretch="None" Stroke="Black" StartAngle="45" VerticalAlignment="Center" Width="220"/>

        <ed:Arc ArcThickness="40" ArcThicknessUnit="Pixel" EndAngle="180" Fill="Black" HorizontalAlignment="Center" Height="220" 
                Stretch="None" Stroke="Black" StartAngle="135" VerticalAlignment="Center" Width="220"/>

        <ed:Arc ArcThickness="40" ArcThicknessUnit="Pixel" EndAngle="270" Fill="Black" HorizontalAlignment="Center" Height="220"
            Stretch="None" Stroke="Black" StartAngle="225" VerticalAlignment="Center" Width="220"/>

        <ed:Arc ArcThickness="40" ArcThicknessUnit="Pixel" EndAngle="360" Fill="Black" HorizontalAlignment="Center" Height="220"
            Stretch="None" Stroke="Black" StartAngle="315" VerticalAlignment="Center" Width="220"/>
    </Grid>
</Window>

在项目中添加程序集引用。 Microsoft.Expression.Drawing

对于xmlns:ed=http://schemas.microsoft.com/expression/2010/drawing

输出


这是我正在做的一个棋盘游戏。
Size
用作
Size=“XX,YY”
其中
XX
是圆弧的x半径,
YY
是圆弧的y半径。对于一个完美的圆弧,你会希望它们相等。根据您给出的尺寸,内弧的尺寸应为
50,50
,外弧的尺寸应为
100100
。完美的尺寸只需是圆的尺寸即可。他们在这方面的文档并不像实际那样简单。我只是需要小心,以获得正确的扫描方向,它工作得很好。@captncraig你能发布更新后的XAML,以便其他人可以看到你接受的解决方案吗?@Pete,如果我没记错的话,我实际上是在后面的代码中编码的。这对于我的特定用例来说更有意义。这对我来说非常有效,但我确实必须将第一个线段向下移动到底部,最后添加到
PathSegmentCollection
中,这样它将以笔划显示,这样我就可以拥有带有轮廓的形状。我不知道为什么,但它奏效了,所以我很好。