Мне нужно добавить объекты геометрии к холсту с помощью кода. Значение при нажатии кнопки добавляется форма. Я отправил холст в качестве параметра функции, а затем использовал canvas.children.add(), но этот вид винтов для всей идеи mvvm, не так ли? Есть ли лучший способ сделать это?лучший способ добавить фигуры в холст с помощью wpf?
ответ
Нет, нет лучшего способа сделать это.
Если вы определяете фигуры в XAML, они получают Add() 'ed в Canvas.Children точно так же.
Теперь, если вы хотите сделать это в чистом режиме Mvvm, вам, вероятно, придется изобретать свою модель. Я бы добавил VM ICommand для кнопки (так что вы можете подключиться к ней), в обработчике я бы добавил какой-то объект в ObservableCollection, а затем сделаю что-то в своем представлении, чтобы создать фигуры из этой коллекции ViewModel (в xaml или codebehind)
Вы можете использовать ItemsControl
с Canvas
как панель с элементами. Затем в виртуальной машине вам понадобится коллекция для хранения всех элементов. Каждый элемент должен иметь все свойства для размещения.
Так, в коде, он будет выглядеть следующим образом (я опускаю уведомление об изменении для краткости):
деталь:
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
}
В VM:
public ObservableCollection<CanvasShape> Shapes {get; set;}
.....
//Add some logic to fill the collection
В 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>