WPF CAD-подобная система - все данные в классах - PullRequest
2 голосов
/ 10 сентября 2009

Все еще прокладываю свой путь через изучение XAML / WPF. Если кто-то может показать мне, как выполнить следующее, это поможет мне в разработке моего следующего проекта (и нескольких подобных проектов в будущем).

Скажем, у меня есть коллекция объектов, которая определяет объекты, которые будут нарисованы на холсте. Объекты содержат всю информацию, необходимую для визуализации объектов, включая форму, цвет и местоположение. Можно ли создать элемент управления XAML, который привязывается к этой коллекции и обрабатывает рендеринг, или это лучше сделать, рисуя на холсте в выделенном фрагменте кода?

Еще один момент - объекты должны в конечном итоге выбираться щелчком, выбираться через прямоугольник-лассо и перетаскиваться. Это не должно быть решено в примере кода, который кто-то предоставляет, но я подумал, что было бы полезно знать это, поскольку это может повлиять на различные реализации.

Пример класса ниже. заранее спасибо.

Class DrawingElement

  readonly property Shape as string    ("circle", "square", "triangle")
  readonly property Position as point  (coordinates)
  readonly property Color as string    ("red", "blue", "yellow")

end class

Sub Main

   dim lst as new List(of DrawingElement)

   lst.add(new DrawingElement("Circle", 10,20, "Blue"))
   lst.add(new DrawingElement("Square", 80,35, "Red"))
   lst.add(new DrawingElement("Triangle", 210,120, "Yellow"))

   <draw lst!>

End Sub

1 Ответ

2 голосов
/ 10 сентября 2009

Можно сделать, но не используя магические строки (например, «круг»), как в вашем примере.

Во-первых, вы должны проектировать свои модели на основе существующих элементов каркаса, а не разрабатывать модель с идеей создания новых элементов пользовательского интерфейса или попытки создать код, который интерпретирует их .

В WPF уже есть эллипс (круг), прямоугольник (квадрат) и целый ряд других геометрических примитивов для использования. Вы захотите создать модели, которые содержат общедоступные привязываемые свойства, которые можно привязать к экземплярам этих элементов, чтобы контролировать их форму и местоположение.

Не вдаваясь в подробности (или тестирование), я бы сделал что-то вроде этого

public class GeometricElement : INotifyPropertyChanged
{
  // these are simplified and don't show INPC code
  public double Left {get;set;} 
  public double Top {get;set;}
  public Brush Fill {get;set;}
  // ...
}

// ...

public class Square : GeometricElement
{
  public double Width {get;set;}
  public double Height {get;set;}
}

// ...

// bound to the window
public class CadAppDataContext
{
  public ObservableCollection<GeometricElement> Elements {get; private set;}
}

И в моем xaml это выглядело бы как

<ItemsControl ItemsSource="{Binding Source={StaticResource cadAppDataContext}}" >
  <ItemsControl.ItemsPanel>
    <ItemsPanelTemplate>
      <Canvas />
    </ItemsPanelTemplate>
  </ItemsControl.ItemsPanel>
  <ItemsControl.Resources>
    <DataTemplate TargetType="{x:Type me:Square}">
      <Rectangle 
         Canvas.Left="{Binding Left}"
         Canvas.Top="{Binding Top}"
         Width="{Binding Width}"
         Height="{Binding Height}"
         Fill="{Binding Fill}" />
    </DataTemplate>
    <!-- more DataTemplates for circle, triangle, etc etc -->
  </ItemsControl.Resources>
</ItemsControl>

ItemsControl создаст элемент Canvas и для каждого GeometricElement в моей коллекции Elements добавит новый дочерний элемент пользовательского интерфейса на основе типа объекта в Elements.

Элементы управления элементами связаны с коллекциями и могут добавлять или удалять элементы в зависимости от того, что происходит в коллекции в вашем коде. Он определяет добавляемый элемент пользовательского интерфейса, ища DataTemplate , предназначенный для определенного типа. Это обычная и важная схема, и поэтому использование магических струн в конечном итоге навредит вам; маршрут волшебной строки не позволит вам использовать возможности уже встроенной в WPF платформы.

Теперь я не говорю, что это будет работать из коробки. Вы, вероятно, натолкнетесь на свойства, которые не будут связываться без какого-либо тяжелого подъема. Возможно, вам даже придется расширить геометрические примитивы, чтобы заставить их вести себя так, как вы хотите. Но это шаблон, используемый в приложениях WPF. Понимание схемы и ее использование помогут вам избежать многих часов стресса и неудач.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...