C#ScatterView,如何将两个项目绑定在一起表现为一个?

时间:2011-07-12 19:08:20

标签: c# wpf image scatterview

我有一个scatterview控件,我从URL中加载了相当大的图像。图像大小不同,有时图像太大而无法一体式抓取,我必须将其中的两半作为单独的图像下载。我正试图加入这两个部分,使它们看起来像一个整体。我已经杀了两天并且接近了,但并不完美。 我试过的事情: 将两半添加到StackPanel,然后使用ScatterViewItem进行包装。出于某种原因,如果面板比它高得多,SVI不会正确调整其尺寸。我尝试了一些方法,包括MSDN上建议的样式,让SVI调整其内容的高度/宽度。对于大多数情况来说效果很好,但是如果图像很长很窄,那么它的一大块就会被砍掉*(见下文)。

将两半添加到画布中。似乎没有通过操作正确调整大小。

将两半添加到网格中。不能得到一半形成一个图像。奇怪的是,整个网格由SVI正确显示,包括长图像。但是,这两个部分要么位于每个部分的顶部(没有水平对齐),要么相距很远(进行列def并将它们设置为col 0和1),或几乎完美但它们之间有一个小间隙(设置一个到左边是对齐,另一边是右边的。)

*到目前为止,StackPanel似乎最有前途。我可以通过手动设置SVI MinWidth来显示整个事物,但是控件的操作命中区域大于图像本身。我一直在尝试使用图像的SizeChanged事件,尝试在图像实际加载时动态调整SVI midwith,使其等于它们的组合渲染宽度,但到现在它开始变得比科学更多的萨满教。我正在将随机代码扔到这个东西上,并希望结果会有一些用处或见解。 我认为,问题的一部分是图像源位图在将图像添加到容器后实际下载需要5秒钟,并且它被包装到SVI中,并且svi被添加到散点图本身。它告诉我,在位图准备好并渲染图像之前,每个图像的高度为NaN,但实际高度为87。这一切如何影响堆栈面板和SVI的大小,我真的不知道。

所以,也许某人有一些洞察力或建议可以尝试,而我一直在修修补补,希望能有一些东西出来。

2 个答案:

答案 0 :(得分:2)

我曾经在Microsoft工作,负责创建ScatterView控件。这个问题确实有两个部分:

首先,为什么ScatterViewItem大小的行为很奇怪? ScatterViewItems将根据其内容自动调整大小,但这样做会强制实施2个限制:a)初始高度和宽度足够大,以便用户可以轻松抓住项目以调整其大小并且b)初始高度和宽度足够小以至于该项目仅占屏幕每个维度的不超过20%,为其他项目留出空间可见。如果您明确设置高度和高度,则可以覆盖这两种行为。宽度属性你自己。

其次,将多个图像组合成单个ScatterViewItem的最佳方法是什么?我的建议是创建一个WriteableBitmap,它是组合图像的大小。把它放到你的ScatterViewItem中。然后,在下载每个图像块时,将该块插入WriteableBitmap。这将产生更好的性能,并确保在接缝处出现的视觉工件没有问题。

答案 1 :(得分:0)

如果StackPanel几乎正常工作,但您在调整大小时遇到​​问题,可能需要尝试使用DockPanel。

StackPanel不会限制它的子项在其Orientation方向上的大小,因此它在该方向上的大小实际上是无限的,这可能导致您描述的奇怪的大小调整行为的类型(这就是为什么它们通常是包装在像ListBox这样的ScrollViewer中。)

如果所有项目都使用相同的DockPanel.Dock设置,则DockPanel执行相同类型的堆叠行为,但基于父布局使用大小调整约束。它可能能够为您提供Grid和StackPanel正在做的正确组合。

网格也可以正常设置 - 没有看到它我想2自动行或列,两个图像上的水平和垂直对齐设置为拉伸可能会这样做。如果在图像没有填满SVI时需要占用空白空间,它可能还需要一个额外的空*行或列。