2009-01-17 32 views
7

Sadece birbirinin üstünde iki ızgara var. Dünyanın bir devleti göz önüne alındığında, A'nın bir üstte olmasını istiyorum, dünyanın başka bir durumu göz önüne alındığında, B ızgarasının üstte olmasını istiyorum. Eski günlerde sadece grid.BringToFront() diyebiliriz, ancak bu artık mevcut değil ve bunu gerçekleştirmenin herhangi bir yolunu anlayamıyorum.Bir öğeyi wpf'deki önden nasıl getirebilirim?

Elde edebileceğimin en iyi yolu, bu işlevselliğe izin vermek için kendi özel sınıflarımı oluşturmam gerekiyor, ancak bu çok basit bir şey için büyük bir aşırı sıkıntı gibi görünüyor.

cevap

11

Bir panelde elementlerin görüntülenme sırasını değiştirmek için Panel.ZIndex özelliğini kullanabilirsiniz

+0

soru, siparişi değiştirmekle ilgili değildi, ama ön tarafa getirdi, kesinlikle var olan MaxOrder'ı kurmakta ve bu siparişin daha büyük bir kısmını oluşturuyor ... – serhio

0

Bunun ayrıntılı bir örnek Sen Z endeksi özelliğini kullanmak zorunda ve çünkü hiçbir dahili Here

3

olduğunu -ne istediğini yapmak için kendi kendime yaptım. Z değeri ne kadar yüksekse, kontrolün önündeki 'daha yakın' olur. Yani, yüksek bir Z değeri ayarlamaya gerek kalmadan kontrolünüzü en üst seviyeye taşımak istiyorsunuz.

Yani burada kendimi tam olarak yapmak için yazdığım küçük bir fonksiyonudur. Not: Bu, bir Canvas ve UserControls kullandığınızı varsayar. Yani sizin durumunuz değilse, biraz uyarlamanız gerekebilir.

Temel olarak, kontrolün indeksini hareket ettirecek, o anda üzerinde herhangi bir kontrol 1'e düşecek ve hareket edecek kontrol (hiyerarşiyi korumak için) üstüne getirilecektir.

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) 
      { 
      } 
    } 
+0

zzzzz ... herkes tuval kullanmıyor – user1034912

-1

kime ilgiliye:

ZIndex özelliktir 0 varsayılan olarak, böylece bir 1'den fazla eleman ile Tuval (> benim durumumda 4000 Şekiller'in) (benim gibi) varsa, Hepsi ZIndex = 0 olacaktır, bu nedenle ZIndexes'i bu yöntemle değiştirmenin hiçbir etkisi olmayacaktır.

Bunun çalışması için, tüm öğeleri oluşturduktan sonra ZIndexleri bilinen bir değere ayarlıyorum, böylece sipariş verilebilir.

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++); 
    } 
1

yerine iki ızgaralar istifleme Daraltmış kullanılarak değildir ızgara çok görünürlük özelliklerini değiştirmek.