我试图通过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。我已经尝试将它们更改为双倍,但图像仍未显示在我希望它们的位置。它们只显示在屏幕的左上角 - 彼此叠加。
有人能看到问题吗?
答案 0 :(得分:1)
您使用的是包URI
格式,该格式仅在您的图片的Build Action
为“Embedded Resource
”时才有效。即便如此,我也不确定URI
实际上是否支持Image.Source
格式,URI
必须是Relative
还是Absolute
。检查图像Build Action
(Right 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天,功能齐全。