关于子图:每个子图是一个MultiScaleSubImage对象,其在MultiScaleImage的SubImages属性中。
如何移动子图位置:你可以通过指定该子图的ViportOrgin属性来指定它的位置,比如subImage.ViportOrgin = new Point(x,y);所以如果你想将子图像WPF中一样排列成Grid元素一样,没办法,一个一个计算x,y然后指定吧。
如何缩放子图:你可以通过子图的ViewportWidth属性来控制,值越大子图就越小。
如何显示或隐藏子图:没有visibility或相关属性,但你可以通过设置其Opacity(不透明度)来实现。
如何获取指定子图的位置和大小(Rect)
参考这个方法:
private Rect GetSubImageRect(MultiScaleImage msi, int index)
{
if (index < 0 || index >= msi.SubImages.Count)
{
return Rect.Empty;
}
MultiScaleSubImage image = msi.SubImages[index];
double scaleBy = 1 / image.ViewportWidth;
return new Rect(-image.ViewportOrigin.X * scaleBy,
-image.ViewportOrigin.Y * scaleBy,
scaleBy,
(1 / image.AspectRatio) * scaleBy);
}
{
if (index < 0 || index >= msi.SubImages.Count)
{
return Rect.Empty;
}
MultiScaleSubImage image = msi.SubImages[index];
double scaleBy = 1 / image.ViewportWidth;
return new Rect(-image.ViewportOrigin.X * scaleBy,
-image.ViewportOrigin.Y * scaleBy,
scaleBy,
(1 / image.AspectRatio) * scaleBy);
}
如何根据X,Y坐标得到相应位置处的子图:
参考这个方法:
private int GetImageIndexFromPosition(MultiScaleImage msi, Point pt)
{
pt = msi.ElementToLogicalPoint(pt);
for (int i = 0; i < msi.SubImages.Count; i++)
{
MultiScaleSubImage image = msi.SubImages[i];
double scaleBy = 1 / image.ViewportWidth;
Rect imageRect = this.GetSubImageRect(msi, i);
if (imageRect.Contains(pt))
{
return i;
}
}
return -1;
}
{
pt = msi.ElementToLogicalPoint(pt);
for (int i = 0; i < msi.SubImages.Count; i++)
{
MultiScaleSubImage image = msi.SubImages[i];
double scaleBy = 1 / image.ViewportWidth;
Rect imageRect = this.GetSubImageRect(msi, i);
if (imageRect.Contains(pt))
{
return i;
}
}
return -1;
}
相信有了这些知识就已经能做出不错的效果了。