SORU
11 Mart 2009, ÇARŞAMBA


Nasıl adı veya Türüne göre WPF denetimleri bulabilirim?

Verilen ad ya da bir tür maç denetimleri için WPF kontrol hiyerarşisi aramam gerek. Bunu nasıl yapabilirim?

CEVAP
18 Kasım 2009, ÇARŞAMBA


Şablon biçim John Myczek tarafından kullanılan birleştirdim ve yukarıda S algoritması, herhangi bir ebeveyn için kullanılabilir findChild bir Algoritma oluşturmak için Tri. Özyinelemeli olarak bir ağaç aramaya aşağıya doğru uzun bir süreç olabilir unutmayın. Sadece rasgele kontrol Bu bir WPF uygulama yaptım, bulabileceğiniz herhangi bir hata hakkında yorum lütfen ve benim kod doğru olacak.

WPF Snoop visual ağaca bakıp yararlı bir araç şiddetle veya işinizi kontrol etmek için bu algoritma testi kullanırken kullanmanızı tavsiye ediyorum.

Tri Q Algoritması küçük bir hata var.Çocuk bulunduktan sonra, eğer childrenCount ^ ise . Ve düzgün buldum çocuğun üzerine biz tekrar yinelemek 1. Bu nedenle a if (foundChild != null) break; benim kod bu durum ile başa çıkmak için ekledim.

/// <summary>
/// Finds a Child of a given item in the visual tree. 
/// </summary>
/// <param name="parent">A direct parent of the queried item.</param>
/// <typeparam name="T">The type of the queried item.</typeparam>
/// <param name="childName">x:Name or Name of child. </param>
/// <returns>The first parent item that matches the submitted type parameter. 
/// If not matching item can be found, 
/// a null parent is being returned.</returns>
public static T FindChild<T>(DependencyObject parent, string childName)
   where T : DependencyObject
{    
  // Confirm parent and childName are valid. 
  if (parent == null) return null;

  T foundChild = null;

  int childrenCount = VisualTreeHelper.GetChildrenCount(parent);
  for (int i = 0; i < childrenCount; i  )
  {
    var child = VisualTreeHelper.GetChild(parent, i);
    // If the child is not of the request child type child
    T childType = child as T;
    if (childType == null)
    {
      // recursively drill down the tree
      foundChild = FindChild<T>(child, childName);

      // If the child is found, break so we do not overwrite the found child. 
      if (foundChild != null) break;
    }
    else if (!string.IsNullOrEmpty(childName))
    {
      var frameworkElement = child as FrameworkElement;
      // If the child's name is set for search
      if (frameworkElement != null && frameworkElement.Name == childName)
      {
        // if the child's name is of the request name
        foundChild = (T)child;
        break;
      }
    }
    else
    {
      // child element found.
      foundChild = (T)child;
      break;
    }
  }

  return foundChild;
}

Bu gibi diyoruz:

TextBox foundTextBox = 
   UIHelper.FindChild<TextBox>(Application.Current.MainWindow, "myTextBoxName");

Application.Current.MainWindow herhangi bir üst pencere olabilir.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Hak5

    Hak5

    7 EYLÜL 2005
  • kindlechatmail

    kindlechatma

    25 AĞUSTOS 2010
  • movies95

    movies95

    27 Kasım 2006