Como converter a posição X / Y em propriedades Canvas Left / Top ao usar ItemsControl
Estou tentando usar um Canvas para exibir objetos que tenham localização "mundo" (em vez de localização "tela"). A tela é definida assim:
<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 é definido assim:
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; }
}
Além disso, tenho um método para converter entre coordenadas do mundo e da tela:
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);
}
Com a implementação atual, os itens são posicionados no local errado, porque o local não é convertido em coordenadas da tela.
Como posso aplicar o método worldToScreen nos objetos MyItem antes de serem adicionados à tela?
Editar:Fiquei um pouco confuso se estou indo no caminho certo, então postei outra pergunta:Como usar o WPF para visualizar um mundo 2D simples (mapa e elementos)
Há uma resposta útil e completa também para esta pergunta