我有一个ItemsControl使用一个Canvas作为ItemsPanel。 itemsTemplate托管一个自定义控件。点击控件时,我希望它“移动到前面”。我知道我可以在我的控制与zIndex的做到这一点,像这样:Wpf带到前面
private void MyControl_PreviewMouseDown(object sender, MouseButtonEventArgs e)
{
if(((FrameworkElement)sender).TemplatedParent==null) return;
ContentPresenter presenter = (ContentPresenter)((FrameworkElement) sender).TemplatedParent;
int currentValue = Panel.GetZIndex(presenter);
Console.WriteLine(currentValue);
Panel.SetZIndex(presenter, 99);
}
这个工作并设置zIndex的就好了。但是当我在ItemsControl中点击不同的控件时,它将得到完全相同的ZIndex,因此它不会“移到其他控件的前面”。
基本上我只是想与Windows展览一样的行为。
我试着在PreviewMouseUp事件中设置ZIndex回到0,并且确保点击的控件总是在顶部,但是因为所有其他控件具有相同的ZIndex为0,那么将假设基于默认的顺序在列表中的位置。
一个例子:
可以说我有3个控制所有为0的zIndex的
如果我点击控制3,然后2然后1(所以他们使用默认的列表中的位置)。我期望它在ZOrder的顶部有3个,然后是2然后是1.但是因为我在MouseUp上将ZIndex设置为零,所以它的默认顺序是1,2,3。
有没有一种简单的方法来处理这个问题,还是我需要跟踪订单并递增递减一个任意值,例如99我自己?
那么为了溢出'ZIndex',你需要'int.MaxValue'点击,即使有人以每秒10次,每天24次的令人难以置信的速度点击,这仍需要将近7年的连续时间,不间断的超级点击!所以我不认为有什么可担心的。另外,静态成员'ZIndex'的初始值不应该为'0',因为第一次点击会分配'1',这可能低于另一个控件的'ZIndex'。最好用'1000'来初始化它,以确保这种方法从第一次点击开始就起作用。 – 2012-12-25 15:23:09
辉煌。这也适用于我(略有不同)的情况。我删除了每个函数开头的if()检查,并将演示者更改为声明为:ContentControl presenter =(ContentControl)((FrameworkElement)sender);'。感谢您的解决方案! – Zyre 2015-11-29 16:58:21