私は何かの中に要素を見つけるはずの次のコードを持っています。問題は、DataGridの最初の列にCheckBoxがあることです。チェックボックス自体は、親子ウィンドウの<controls:ChildWindow.Resources>
辞書に存在するスタイルで定義されています。Silverlight 4 - ビジュアルツリーヘルパーは0個の子要素を返しますか?
実行時に、グリッドのバインディングコレクションのすべての要素が「選択」されている場合、気を付けてチェックボックスを選択する必要があります。しかし、チェックボックスはスタイル内に存在するので簡単にはアクセスできないため、特定のチェックボックスを見つけるためにDOM全体を調べる必要があります。
これは、DOMトラバーサルを作成するコードです。それは、私がFrameworkElement
から継承任意のコントロールからFindElementまたはGetChildrenメソッドのメソッドを呼び出すことができますのでをするFrameworkElementする拡張メソッドとして実装されています
public static class FrameworkElementExtensions
{
public static FrameworkElement FindElement(this FrameworkElement parentFrameworkElement, string childFrameworkElementNameToSearch)
{
FrameworkElement childFrameworkElementFound = null;
parentFrameworkElement.SearchElements(ref childFrameworkElementFound, childFrameworkElementNameToSearch);
return childFrameworkElementFound;
}
public static List<FrameworkElement> GetChildren(this FrameworkElement parentElement)
{
List<FrameworkElement> childFrameworkElementsFound = new List<FrameworkElement>();
parentElement.GetChildren(childFrameworkElementsFound);
return childFrameworkElementsFound;
}
public static void SearchElements(this FrameworkElement parentFrameworkElement, ref FrameworkElement childFrameworkElementToFind, string childFrameworkElementName)
{
int childrenCount = VisualTreeHelper.GetChildrenCount(parentFrameworkElement);
if (childrenCount > 0)
{
FrameworkElement childFrameworkElement = null;
for (int i = 0; i < childrenCount; i++)
{
childFrameworkElement = (FrameworkElement)VisualTreeHelper.GetChild(parentFrameworkElement, i);
if (childFrameworkElement != null && childFrameworkElement.Name.Equals(childFrameworkElementName))
{
childFrameworkElementToFind = childFrameworkElement;
return;
}
childFrameworkElement.SearchElements(ref childFrameworkElementToFind, childFrameworkElementName);
}
}
}
public static void GetChildren(this FrameworkElement parentFrameworkElement, List<FrameworkElement> allChildFrameworkElement)
{
int childrenCount = VisualTreeHelper.GetChildrenCount(parentFrameworkElement);
if (childrenCount > 0)
{
for (int i = 0; i < childrenCount; i++)
{
FrameworkElement childFrameworkElement = (FrameworkElement)VisualTreeHelper.GetChild(parentFrameworkElement, i);
allChildFrameworkElement.Add(childFrameworkElement);
childFrameworkElement.GetChildren(allChildFrameworkElement);
}
}
}
}
ので、手での問題は、私はSomeDataGrid.FindElement("HeaderCheckBox");
の線に沿って何かを呼び出すときに常にnullを返します。ここでは、HeaderCheckBoxというスタイルで定義されたSomeDataGridとCheckBoxというDataGridがあると仮定します。
さらにデバッグすると、これらの拡張メソッドをどのコントロールから呼び出すかにかかわらず、コード内の最後の2つのメソッドで使用されたVisualTreeHelper.GetChildrenCount
メソッド呼び出しは常に0を返します。 WTF?
誰でもこの問題を解決する方法はありますか? ありがとう、 Martin
こんにちは...あなたのコードを新しいプロジェクトでテストしたところ、私が求めたものすべてが見つかりました。私が疑問を抱いていたスタイルのCheckBoxさえも可能です。ちなみに、私のGetChildrenCount(あなた...あなた)は、常に子供たちの実際の数を返しました。 – NestorArturo
参照:http://geekswithblogs.net/codingbloke/archive/2010/12/19/visual-tree-enumeration.aspx – AnthonyWJones
@NestorArturoコードを追加してもよろしいですか?私は他の人の実装をテストして、私が狂っていないことを確認したいと思っています。プラス答えとして執筆するなら、答えのポイントも与えます。 – bleepzter