C# 使用wpf向画布添加形状的最佳方法?

C# 使用wpf向画布添加形状的最佳方法?,c#,wpf,canvas,C#,Wpf,Canvas,我需要通过代码将几何体对象添加到画布。。这意味着当您单击按钮时,将添加一个形状。我将canvas作为一个参数发送给函数,然后使用canvas.children.add(),但这会破坏整个mvvm的想法,不是吗?有更好的方法吗?没有,没有更好的方法 如果您在XAML中定义形状,它们将以相同的方式添加到Canvas.Children 现在,如果您想以一种干净的Mvvm方式来实现这一点,您可能必须在viewmodel上有所创新。我会为按钮添加一个VM ICommand(这样您就可以连接它),在处理程序

我需要通过代码将几何体对象添加到画布。。这意味着当您单击按钮时,将添加一个形状。我将canvas作为一个参数发送给函数,然后使用canvas.children.add(),但这会破坏整个mvvm的想法,不是吗?有更好的方法吗?

没有,没有更好的方法

如果您在XAML中定义形状,它们将以相同的方式添加到Canvas.Children


现在,如果您想以一种干净的Mvvm方式来实现这一点,您可能必须在viewmodel上有所创新。我会为按钮添加一个VM ICommand(这样您就可以连接它),在处理程序中,我会向ObservableCollection添加某种类型的对象,然后在视图中执行一些操作,从ViewModel集合(在xaml或codebehind中)创建形状。

您可以使用
ItemsControl
Canvas
作为项目面板。然后在VM中,您需要一个集合来保存所有项目。每个项目都应具有用于放置的所有属性

因此,在代码中,它将如下所示(为了简洁起见,我省略了更改通知):

该项目:

public class CanvasShape : INotifyPropertyChanged
{
    public double Top {get; set;}//TODO: add change notification
    public double Left {get; set;}//TODO: add change notification
    public Geometry PathData {get; set;}//TODO: add change notification
}
在虚拟机中:

public ObservableCollection<CanvasShape> Shapes {get; set;}
.....
//Add some logic to fill the collection
publicobservableCollection形状{get;set;}
.....
//添加一些逻辑来填充集合
在XAML中:

<!--The DataContext here is the VM-->
<ItemsControl ItemsSource="{Binding Shapes}">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <Canvas IsItemsHost="True"/>
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <ItemsControl.ItemContainerStyle>
        <Style>
            <!--These setters will control the position of the shape; the DataContext here is CanvasShape-->
            <Setter Property="Cavas.Top" Value="{Binding Top}"/>
            <Setter Property="Cavas.Left" Value="{Binding Left}"/>
        </Style>
    </ItemsControl.ItemContainerStyle>
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <Path Data="{Binding PathData}"
                  .......
                  />
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>