在WPF中使用BringToFront

ser*_*hio 15 .net wpf wpf-controls

我需要在WPF中引入自定义控件.

伪代码

OnMouseDown()
{
    if (this.parent != null)
        this.parent.BringToFront(this);
}
Run Code Online (Sandbox Code Playgroud)

我知道,我知道有一个ZIndex,但仍然不明白如何将简单的WinForm替换BringToFrontparent.SetZIndex(this, ?MaxZIndex(parent)? + 1)

也许有更好的方法在像WPF这样的酷事中做到这一点?!..

Eri*_*ren 18

这是一个扩展函数,它将方法BringToFront功能添加到Panel中包含的所有FrameworkElements.

  public static class FrameworkElementExt
  {
    public static void BringToFront(this FrameworkElement element)
    {
      if (element == null) return;

      Panel parent = element.Parent as Panel;
      if (parent == null) return;

      var maxZ = parent.Children.OfType<UIElement>()
        .Where(x => x != element)
        .Select(x => Panel.GetZIndex(x))
        .Max();
      Panel.SetZIndex(element, maxZ + 1);
    }
  }
Run Code Online (Sandbox Code Playgroud)

  • Panel.SetZIndex 正是我所需要的。谢谢。 (2认同)

Cod*_*ked 14

你真正希望的最好的方法是使一个元素相对于同一父面板中的任何兄弟元素(例如StackPanel,Grid,Canvas等)最顶层.面板中项目的z顺序由Panel.ZIndex附加属性控制.

例如:

<Grid>
    <Rectangle Fill="Blue" Width="50" Height="50" Panel.ZIndex="1" />
    <Rectangle Fill="Red" Width="50" Height="50" Panel.ZIndex="0" />
</Grid>
Run Code Online (Sandbox Code Playgroud)

在此示例中,蓝色矩形将显示在顶部.这个博客文章对此进行了解释.

Panel.ZIndex的更改也没有立即反映在UI中.有一个私有方法允许刷新z-index,但由于它是私有的,因此使用它不是一个好主意.要解决它,您必须删除并重新添加子项.

但是,您不能将任何给定元素置于最顶层.例如:

<Grid>
    <Grid>
        <Rectangle Fill="Blue" Width="50" Height="50" Panel.ZIndex="1" />
        <Rectangle Fill="Red" Width="50" Height="50" Panel.ZIndex="0" />
    </Grid>
    <Grid>
        <Rectangle Fill="Green" Width="50" Height="50" Panel.ZIndex="0" />
        <Rectangle Fill="Yellow" Width="50" Height="50" Panel.ZIndex="0" />
    </Grid>
</Grid>
Run Code Online (Sandbox Code Playgroud)

在这种情况下,将显示黄色矩形.因为第二个内部网格显示在第一个内部网格的顶部以及它的所有内容.您必须像这样改变它以将蓝色矩形置于顶部:

<Grid>
    <Grid Panel.ZIndex="1">
        <Rectangle Fill="Blue" Width="50" Height="50" Panel.ZIndex="1" />
        <Rectangle Fill="Red" Width="50" Height="50" Panel.ZIndex="0" />
    </Grid>
    <Grid Panel.ZIndex="0">
        <Rectangle Fill="Green" Width="50" Height="50" Panel.ZIndex="0" />
        <Rectangle Fill="Yellow" Width="50" Height="50" Panel.ZIndex="0" />
    </Grid>
</Grid>
Run Code Online (Sandbox Code Playgroud)

在处理ItemsControl时,这个问题是相关的.大多数其他控件只有一个孩子,但你仍然需要将它们带到前面,以使其中任何一个孩子最顶级.

最后,Adorners是将事物置于一切之上的好方法,但它们不是主要视觉树的一部分.所以我不确定这会对你的情况有效.