Большое спасибо за пример кода!
ольно новичок в 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?