您的位置:首页 > 其它

WPF 图层管理

2011-08-31 10:59 141 查看
玩过phtoshop或者blend的人都知道里面都一个图层管理器,管理图层的遮挡顺序,有置顶层、置底层、置下一层、置上一层四个管理方式。

那么在wof中我们应该怎么玩呢? 请看代码,支持多个图层同时操作。

首先置顶:

private void BringToFront(List<UIElement> CurrentSelection ,UIElementCollection childrens)
{
List<UIElement> selectionSorted = (from item in CurrentSelection
orderby Canvas.GetZIndex(item as UIElement) ascending
select item as UIElement).ToList();

List<UIElement> childrenSorted = (from UIElement item in childrens
orderby Canvas.GetZIndex(item as UIElement) ascending
select item as UIElement).ToList();

int i = 0;
int j = 0;
foreach (UIElement item in childrenSorted)
{
if (selectionSorted.Contains(item))
{
int idx = Canvas.GetZIndex(item);
Canvas.SetZIndex(item, childrenSorted.Count - selectionSorted.Count + j++);
}
else
{
Canvas.SetZIndex(item, i++);
}
}
}


置底类似:

private void SendToBack(List<UIElement> CurrentSelection ,UIElementCollection childrens)
{
List<UIElement> selectionSorted = (from item in CurrentSelection
orderby Canvas.GetZIndex(item as UIElement) ascending
select item as UIElement).ToList();

List<UIElement> childrenSorted = (from UIElement item in childrens

orderby Canvas.GetZIndex(item as UIElement) ascending
select item as UIElement).ToList();
int i = 0;
int j = 0;
foreach (UIElement item in childrenSorted)
{
if (selectionSorted.Contains(item))
{
int idx = Canvas.GetZIndex(item);
Canvas.SetZIndex(item, j++);

}
else
{
Canvas.SetZIndex(item, selectionSorted.Count + i++);
}
}
}


 置下一层:

private void SendBackward(List<UIElement> CurrentSelection ,UIElementCollection childrens)

{
List<UIElement> ordered = (from item in CurrentSelection
orderby Canvas.GetZIndex(item as UIElement) ascending
select item as UIElement).ToList();

int count = childrens.Count;

for (int i = 0; i < ordered.Count; i++)
{
int currentIndex = Canvas.GetZIndex(ordered[i]);
int newIndex = Math.Max(i, currentIndex - 1);
if (currentIndex != newIndex)
{
Canvas.SetZIndex(ordered[i], newIndex);
IEnumerable<UIElement> it =childrens.OfType<UIElement>().Where(item => Canvas.GetZIndex(item) == newIndex);

foreach (UIElement elm in it)
{
if (elm != ordered[i])
{
Canvas.SetZIndex(elm, currentIndex);
break;
}
}
}
}
}


 置上一层:

private void BringForward(List<UIElement> CurrentSelection ,UIElementCollection childrens)

{
List<UIElement> ordered = (from item in CurrentSelection
orderby Canvas.GetZIndex(item as UIElement) descending
select item as UIElement).ToList();

int count = childrens.Count;

for (int i = 0; i < ordered.Count; i++)
{
int currentIndex = Canvas.GetZIndex(ordered[i]);
int newIndex = Math.Min(count - 1 - i, currentIndex + 1);
if (currentIndex != newIndex)
{
Canvas.SetZIndex(ordered[i], newIndex);
IEnumerable<UIElement> it = this.Children.OfType<UIElement>().Where(item => Canvas.GetZIndex(item) == newIndex);

foreach (UIElement elm in it)
{
if (elm != ordered[i])
{
Canvas.SetZIndex(elm, currentIndex);
break;
}
}
}
}
}


  

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: