0

リストボックスのすべての子である多くの異なるスタックパネルの子として多くのラベルがあり、Content.toString() == "criteria" であるこれらのラベルの 1 つを参照する必要があります。つまり、実行する親/子メソッドが多数あるため、WPF でビジュアル ツリーをトラバースするのは骨の折れる作業です。ウィンドウでこれらのラベルの 1 つを見つける方法はありますか? たぶん、LINQ を実行できるウィンドウ (階層なし) 内のすべての項目コレクションがありますか??

ラベルの名前がない理由は、データ テンプレートによって生成されるためです。

どうもありがとう、

ダン

4

4 に答える 4

2

あなたが探しているもののようです:DataTemplateで生成された要素を見つける

于 2012-01-09T15:03:47.907 に答える
1

このコードはあなたに役立つと思います:

        foreach (Control control in this.Controls)
        {
            if (control.GetType() == typeof(Label))
                if (control.Text == "yourText")
                {
                    // do your stuff
                }
        }

この質問をベースとして使用しました

于 2012-01-09T15:17:02.110 に答える
1

@anatoliiG がリンクしたコードを少し変更して、指定されたタイプのすべての子コントロールを (最初のコントロールではなく) 返すようにしました。

private IEnumerable<childItem> FindVisualChildren<childItem>(DependencyObject obj)
    where childItem : DependencyObject
{
    for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++)
    {
        DependencyObject child = VisualTreeHelper.GetChild(obj, i);

        if (child != null && child is childItem)
            yield return (childItem)child;

        foreach (var childOfChild in FindVisualChildren<childItem>(child))
            yield return childOfChild;
    }
}

この関数を使用すると、次のようなことができます。

var criteriaLabels =
    from cl in FindVisualChildren<Label>(myListBox)
    where cl.Content.ToString() == "criteria"
    select cl;

foreach (var criteriaLabel in criteriaLabels)
{
    // do stuff...
}
于 2012-01-09T15:31:43.590 に答える
1

これが役立つかどうかはわかりません:

listBox の各スタック パネルで特定のラベルを探している場合は、その特定のラベルとその特定の名前を探して、コンテンツを比較することができます。

于 2012-01-09T14:54:22.130 に答える