这算是个碰上的入门级的问题,但我当时选人的时候拿去做为最最最简单测试题,居然有些人连思路都没有,真的是让我服气。
首先,说一下场景,相信都看过QQ或者是TIM登录界面,输入这个地方是两个控件,自定义的combox和textbox,而且很清晰可以看见,每个控件的border都是1px,鼠标放在任意一个上面,border都会变色。那么问题来了,既然这两个控件的border都是完整会变色的,那么两个控件的border一定有重合区域,但控件一定是有先后绘制的,只能一个盖在另外一个上面。那这是如何实现的呢?
其实对GUI有点认识的人都知道,既然绘制有先后,只需动态改变其Z序,就能将控件置前,使其动态的一个覆盖在另一个上面。在WPF中,子控件的绘制顺序是在父控件中的相对顺序决定的,那么问题就迎刃而解了。
public static void Bring(Control element)
{
if (element == null) return;
Grid parent = element.Parent as Grid;
if (parent == null) return;
var maxZ = parent.Children.OfType<UIElement>()
.Where(x => x != element)
.Select(x => Canvas.GetZIndex(x))
.Max();
Canvas.SetZIndex(element, maxZ + 1);
}
public static void Back(Control element)
{
if (element == null) return;
Grid parent = element.Parent as Grid;
if (parent == null) return;
Canvas.SetZIndex(element, 0);
}