Я пытаюсь использовать Canvas для отображения объектов, которые имеют "мировое" местоположение (а не "экранное" местоположение). Холст определяется так:
<Canvas Background="AliceBlue">
<ItemsControl Name="myItemsControl" ItemsSource="{Binding MyItems}">
<Image x:Name="myMapImage" Panel.ZIndex="-1" />
<ItemsControl.ItemTemplate>
<DataTemplate>
<Canvas>
<TextBlock Canvas.Left="{Binding WorldX}" Canvas.Top="{Binding WorldY}"
Text="{Binding Text}"
Width="Auto" Height="Auto" Foreground="Red" />
</Canvas>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</Canvas>
MyItem определяется следующим образом:
public class MyItem
{
public MyItem(double worldX, double worldY, string text)
{
WorldX = worldX;
WorldY = worldY;
Text = text;
}
public double WorldX { get; set; }
public double WorldY { get; set; }
public string Text { get; set; }
}
Кроме того, у меня есть метод для преобразования между мировыми и экранными координатами:
Point worldToScreen(double worldX, double worldY)
{
// Note that the conversion uses an internal m_mapData object
var size = m_mapData.WorldMax - m_mapData.WorldMin;
var left = ((worldX - m_currentMap.WorldMin.X) / size.X) * myMapImage.ActualWidth;
var top = ((worldY - m_currentMap.WorldMin.Y) / size.Y) * myMapImage.ActualHeight;
return new Point(left, top);
}
В текущей реализации элементы расположены не в том месте, потому что их местоположение не преобразуется в экранные координаты.
Как применить метод worldToScreen к объектам MyItem до их добавления на холст?
Edit:
Я немного запутался, правильно ли я иду, поэтому я написал еще один вопрос: Как использовать WPF для визуализации простого 2D-мира (карта и элементы)
На этот вопрос также есть полезный и полный ответ