Большое спасибо за пример кода!

ольно новичок в 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?

Ответы на вопрос(1)

Ваш ответ на вопрос