2013-04-29 1 views
3

Мне нужно добавить объекты геометрии к холсту с помощью кода. Значение при нажатии кнопки добавляется форма. Я отправил холст в качестве параметра функции, а затем использовал canvas.children.add(), но этот вид винтов для всей идеи mvvm, не так ли? Есть ли лучший способ сделать это?лучший способ добавить фигуры в холст с помощью wpf?

ответ

-1

Нет, нет лучшего способа сделать это.

Если вы определяете фигуры в XAML, они получают Add() 'ed в Canvas.Children точно так же.

Теперь, если вы хотите сделать это в чистом режиме Mvvm, вам, вероятно, придется изобретать свою модель. Я бы добавил VM ICommand для кнопки (так что вы можете подключиться к ней), в обработчике я бы добавил какой-то объект в ObservableCollection, а затем сделаю что-то в своем представлении, чтобы создать фигуры из этой коллекции ViewModel (в xaml или codebehind)

5

Вы можете использовать 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>