我有一个 ItemsControl,它使用 Canvas 作为 ItemsPanel。 itemsTemplate 承载自定义控件。单击控件时,我希望它“移到前面”。我知道我可以在我的控件中使用 ZIndex 来做到这一点,如下所示:
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 都相同,因此将根据其中的位置假定默认顺序列表。
一个例子:
假设我有 3 个控件,所有控件的 ZIndex 均为 0。(因此它们使用默认列表位置。)
如果我单击控件 3,然后是 2,然后是 1。我希望它在 ZOrder 的顶部有 3,然后是 2,然后是 1。但是因为我在 MouseUp 上将 ZIndex 设置为零,所以它的默认顺序为1、2、3。
有没有一种简单的方法来处理这个问题,或者我是否需要跟踪顺序并自行递增递减一个任意值,例如 99?
最佳答案
我会沿着这些路线做一些事情:
鼠标按下时,将所选控件上的 Z-index 设置为一个非常高的数字。
将静态 int Zindex 初始化为 0。
在鼠标向上设置 Z-index 等于 Zindex++
private static int Zindex = 0;
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, Int32.MaxValue);
}
private void MyControl_PreviewMouseUp(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, Zindex++);
}
如果您的程序应该运行很长时间,您可以对 Zorder 设置一些上限,因此如果达到,您可以找到正在使用的最小 z-index,并从所有控件和 Zindex 计数器上的 z-index 中减去它。
关于c# - Wpf 带到前面,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3463116/