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
Ş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.
Nasıl ve/veya neden Git daha iyi SVN g...
Nasıl bir yöntem stacktrace veya yansı...
Nasıl tekrarlayıcı bir başlık denetiml...
Nasıl Sturm ile Waldo bulabilirim?...
Nasıl bir metin veya resim şeffaf bir ...