Windows Phone绑定图像位置

时间:2013-02-13 22:38:36

标签: silverlight windows-phone-7 binding windows-phone-8 windows-phone

我试图通过Binding在画布上的某些位置放置一组图像。

出于某种原因,图像正在显示但不在我指定的位置。

C#

_roomView.Room = new Room
{
   Items = new List<Item> {
   new Item {ImageUri = "/Escape;component/Images/Items/a.jpg", XPosition = 190, YPosition = 50},
   new Item {ImageUri = "/Escape;component/Images/Items/b.png", XPosition = 390, YPosition = 100},
   new Item {ImageUri = "/Escape;component/Images/Items/b.png", XPosition = 490, YPosition = 600}}
};

listBoxItems.ItemsSource = _roomView.Room.Items;

XML

<Canvas>
     <Image Source="{Binding ImageUri}" Stretch="None" Canvas.Left="{Binding Room.Items.XPosition}" Canvas.Top="{Binding Room.Items.YPosition}"/>
</Canvas>

XPositionYPosition的类型为int。我已经尝试将它们更改为双倍,但图像仍未显示在我希望它们的位置。它们只显示在屏幕的左上角 - 彼此叠加。

有人能看到问题吗?

2 个答案:

答案 0 :(得分:1)

您使用的是包URI格式,该格式仅在您的图片的Build Action为“Embedded Resource”时才有效。即便如此,我也不确定URI实际上是否支持Image.Source格式,URI必须是Relative还是Absolute。检查图像Build ActionRight click --> Properties对这些文件)并尝试更改UriKind

无论哪种方式,除非你有充分的理由,最好将媒体资产保持为:
Build Action = Content并使用正常路径URIs。将图像添加到DLLs作为嵌入式资源不利于启动性能,因为将较大的DLLs加载到AppDomain需要更长的时间。 从内存使用角度看它也很糟糕,因为加载到内存中的DLLs现在更大了。

底线:

<Image Source="myPicture.png" />格式的性能要比

好得多

<Image Source="myAssemblyName;component/myPicture.png" />语法。

答案 1 :(得分:1)

您的C#代码包含图像集。

您的XAML仅显示单个图像。如果XAML在列表框数据模板中,您将获得多个画布,每个画布都有1个图像。

要在单个Canvas上显示图像集合,您可以使用例如<ItemsControl>,将ItemsPanel设置为Canvas,在数据模板中指定包含source,canvas.left和canvas.top的单个图像。

如果您尝试使用ListBox而不是ItemsControl执行我所描述的操作,那么它将无法工作,因为它在ItemsPanel和item之间还有一层UI元素,即项容器。

P.S。解决此类GUI问题的最快方法 - XAML Spy,我给自己买了个人许可证。评估为期21天,功能齐全。