Я довольно новичок в WPF и ищу простое решение проблемы, описанной ниже. Я пытался сделать это как можно короче.
Я пытаюсь визуализировать "мир", который моделируется с помощью:
- Изображение карты с известным происхождением в метрах (например, верхний левый угол 14,27) и разрешением в см / пиксель. Карта продолжает расти каждые несколько секунд. Карты маленькие, поэтому пейджинг / мозаика не требуются.
- Реальные элементы и достопримечательности. Каждый элемент имеет 2D позицию в метрах в пределах области карты. Кроме того, каждый элемент может двигаться.
Что касается стороны модели, у меня есть класс WorldState, в котором хранятся карта и элементы:
interface IWorldState
{
IEnumerable<IWorldElement> Elements { get; }
IMapData CurrentMap { get; }
}
interface IWorldElement
{
WorldLocation { get; }
event EventHandler LocationChanged;
}
interface IMapData
{
string FilePath { get; }
WorldLocation TopLeft { get; }
Size MapSize { get; }
}
Теперь, что касается визуализации, я выбрал класс Canvas для рисования карты и элементов. Каждый тип элемента (наследуется от IWorldElement) должен отображаться по-разному. Может быть более одного холста карты с подмножеством элементов.
<Canvas x:Name="mapCanvas">
<Image x:Name="mapImage" />
</Canvas>
В коде мне нужно установить файл изображения карты при его изменении:
void MapChanged(IWorldState worldState)
{
mapImage.Source = worldState.CurrentMap.FilePath;
}
Чтобы нарисовать элементы, у меня есть метод для преобразования WorldLocation в (Canvas.Left, Canvas.Top):
Point WorldToScreen(WorldLocation worldLocation, IWorldState worldState)
{
var topLeft = worldState.CurrentMap.TopLeft;
var size = worldState.CurrentMap.Size;
var left = ((worldLocation.X - topLeft.X) / size.X) * mapImage.ActualWidth;
var top = ((worldLocation.Y - topLeft.Y) / size.Y) * mapImage.ActualHeight;
return new Point(left, top);
}
Теперь вопрос: как мне склеить модель мира и холст? Это можно суммировать как:
- Где разместить функции MapChanged и WorldToScreen .
- Когда элемент перемещается, местоположение в мире необходимо преобразовать в экранные координаты.
- Каждый тип элемента должен быть нарисован по-разному, например, эллипс с текстом или заполненный прямоугольник.
Каков рекомендуемый способ реализации «клеевого» слоя при использовании WPF?