我有一个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);
}
Run Code Online (Sandbox Code Playgroud)
这可以正常工作并设置ZIndex.但是当我点击ItemsControl中的不同控件时,它将获得完全相同的ZIndex,因此它不会"移动到另一个控件的前面".
基本上我只想要与windows展示相同的行为.
我已经尝试在PreviewMouseUp事件中将ZIndex设置为0,这确保了单击的控件始终位于顶部,但由于所有其他控件具有相同的ZIndex为0,因此将基于其中的位置采用默认顺序列表.
一个例子:
假设我有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++);
}
Run Code Online (Sandbox Code Playgroud)
如果您的程序应该运行很长时间,您可能会对Zorder有一些上限,所以如果达到,您可以找到所使用的最小z-index并从所有控件和Zindex计数器上的z-index中减去它.
| 归档时间: |
|
| 查看次数: |
17307 次 |
| 最近记录: |