1

我正在尝试通过 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>

XPosition并且YPosition是 int 类型。我尝试将它们更改为双倍,但图像仍然没有显示在我想要的位置。它们只显示在屏幕的左上角 - 彼此重叠。

任何人都可以看到问题吗?

4

2 回答 2

1

您使用的包URI格式仅在您的图像具有Build ActionEmbedded Resource”时才有效。即使那样,我也不确定URI是否真的支持这种格式Image.Source,如果URI必须是RelativeAbsolute. 检查图像Build ActionRight click --> Properties在那些文件上)并尝试更改UriKind.

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

底线:

<Image Source="myPicture.png" />格式比性能好得多

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

于 2013-02-13T23:18:33.513 回答
1

您的 C# 代码具有图像集合。

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

要在单个 Canvas 上显示一组图像,您可以使用,例如<ItemsControl>,将 ItemsPanel 设置为 Canvas,并在数据模板中指定具有源、canvas.left 和 canvas.top 的单个图像。

如果您尝试使用 ListBox 而不是 ItemsControl 来执行我所描述的操作,它不会起作用,因为它在 ItemsPanel 和 item 之间多了一层 UI 元素,即 item 容器。

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

于 2013-02-15T02:30:59.310 回答