私は単純に2つのグリッドを重ね合わせています。世界のある状態を考えると、グリッド A を一番上に置き、世界の別の状態を考えると、グリッド B を一番上にしたいと思います。昔は grid.BringToFront() を呼び出すだけでしたが、それはもう存在しません。それを実現する方法がわかりません。
私が把握できる最善の方法は、この機能を可能にするために独自のカスタム クラスを作成する必要があることですが、これは非常に単純だったものにとってはやり過ぎのように思えます。
Panel.ZIndexプロパティを使用して、パネル内の要素の表示順序を変更できます
Z インデックス プロパティを使用する必要があります。必要な組み込み関数がないため、独自に作成しました。Z 値が高いほど、コントロールの前面に「近づきます」。したがって、任意の高い Z 値を設定することなく、コントロールを一番上に配置したいと考えています。
そこで、まさにそれを行うために私が自分で書いた小さな関数を次に示します。注: これは、Canvas と UserControls を使用していることを前提としています。そのため、そうでない場合は、少し調整する必要があるかもしれません。
基本的には、移動するコントロールのインデックスを取得し、現在その上にあるコントロールが 1 つ下がり、移動するコントロールが上に配置されます (階層を維持するため)。
static public void BringToFront(Canvas pParent, UserControl pToMove)
{
try
{
int currentIndex = Canvas.GetZIndex(pToMove);
int zIndex = 0;
int maxZ = 0;
UserControl child;
for (int i = 0; i < pParent.Children.Count; i++)
{
if (pParent.Children[i] is UserControl &&
pParent.Children[i] != pToMove)
{
child = pParent.Children[i] as UserControl;
zIndex = Canvas.GetZIndex(child);
maxZ = Math.Max(maxZ, zIndex);
if (zIndex > currentIndex)
{
Canvas.SetZIndex(child, zIndex - 1);
}
}
}
Canvas.SetZIndex(pToMove, maxZ);
}
catch (Exception ex)
{
}
}
ご担当者様:
ZIndex
プロパティはデフォルトで 0 であるため、(私のように) 1 つ以上の要素 (私の場合は >4000 シェイプ) を持つキャンバスがある場合、すべてに がZIndex = 0
あるため、このメソッドで ZIndexes を変更しても効果はありません。
これを機能させるには、すべての要素を作成した後で ZIndexes を既知の値に設定して、後で順序付けできるようにします。
int zIndex = 0;
for (int i = 0; i < canvas.Children.Count; i++) {
UIElement child = canvas.Children[i] as UIElement;
if (canvas.Children[i] is UIElement) Canvas.SetZIndex(child, zIndex++);
}