如何在c#中重用一个形状

时间:2017-07-01 17:17:27

标签: c# xaml

我对这些事情很陌生,所以任何帮助都会非常感激。此外,我已经找到了很多解决方案,但没有找到具体的解决方案。 所以问题是:

我试图创建一个程序,从文件中读取多个图形矢量形状,绘制它们然后可以选择其中一个,修改形状并重新保存整个文件。 我认为为形状构建一个xaml资源文件将是一个开始。 第一个问题:如果我在xaml资源中定义一个简单的形状(椭圆,矩形,路径),我该如何在代码中重用它?一个简单的例子对我有很大帮助。 第二个问题:为了修改形状,我可能必须将所有基本形状转换为路径,以在点(顶点)上应用代码。我怎么能这样做? 第三个问题:一些形状是组合几种基本形状的结果。让我们说我使用组合几何几次以达到最终形状。但是,如何获得组合几何的路径数据,以便解决第二个问题?

1 个答案:

答案 0 :(得分:1)

要“重复使用”形状,您可以将样式定义为App.xaml。例如:

您的App.xaml

<Application x:Class="WpfApp4.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:WpfApp4"
             StartupUri="MainWindow.xaml">

    <Application.Resources>

        <Style x:Key="YellowEllipseWithBlackBorder" TargetType="Ellipse">

            <Setter Property="Fill" Value="Yellow" />
            <Setter Property="Width" Value="100" />
            <Setter Property="Height" Value="100" />
            <Setter Property="StrokeThickness" Value="5" />
            <Setter Property="Stroke" Value="Black" />

        </Style>

    </Application.Resources>

</Application>

您的MainWindow.xaml

<Window x:Class="WpfApp4.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">

    <Grid>

        <StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
            <Ellipse Style="{StaticResource YellowEllipseWithBlackBorder}" />
            <Ellipse Style="{StaticResource YellowEllipseWithBlackBorder}" />
            <Ellipse Style="{StaticResource YellowEllipseWithBlackBorder}" />
        </StackPanel>

    </Grid>

</Window>

结果:

Three ellipses with the same style

如您所见,您应该为您定义一个样式,然后使用以下语法从窗口应用它:<Ellipse Style="{StaticResource YellowEllipseWithBlackBorder}" />

如果您想以编程方式执行相同的操作,可以像上一个示例一样定义形状的样式,然后在窗口的代码后面:

public partial class MainWindow : Window
{
    private StackPanel _stackPanel;

    public MainWindow()
    {
        InitializeComponent();

        _stackPanel = new StackPanel()
        {
            Orientation = Orientation.Horizontal,
            HorizontalAlignment = HorizontalAlignment.Center,
            VerticalAlignment = VerticalAlignment.Center
        };

        Content = _stackPanel;

        AddEllipse();
        AddEllipse();
        AddEllipse();
    }

    public void AddEllipse()
    {
        var ellipse = new Ellipse()
        {
            Style = FindResource("YellowEllipseWithBlackBorder") as Style
        };

        _stackPanel.Children.Add(ellipse);
    }
}

要绘制自定义形状,您可以使用Polygon控件,您可以在其中定义形状的点,例如:

    public void AddPolygon()
    {
        var polygon = new Polygon()
        {
            Fill = new SolidColorBrush(Colors.Red),
            Stroke = new SolidColorBrush(Colors.Black),
            StrokeThickness = 2.0
        };

        polygon.Points.Add(new Point(0, 0));
        polygon.Points.Add(new Point(10, 0));
        polygon.Points.Add(new Point(5, -10));

        _stackPanel.Children.Add(polygon);
    }

结果:

Polygon

要绘制一些曲线,您可以将Path控件与BezierSegment一起使用,例如:

    public void AddPath()
    {
        var canvas = new Canvas();

        var path = new Path()
        {
            Fill = new SolidColorBrush(Colors.Red),
            Stroke = new SolidColorBrush(Colors.Black),
            StrokeThickness = 2.0
        };

        var geometry = new PathGeometry();
        geometry.Figures.Add(new PathFigure(
            new Point(0, 0),
            new List<BezierSegment>()
            {
                new BezierSegment(
                    new Point(0, 0),
                    new Point(100, 0),
                    new Point(50, -100),
                    true)
            },
            false));

        path.Data = geometry;
        canvas.Children.Add(path);
        _stackPanel.Children.Add(canvas);
    }

Path with BezierSegment