1

子コントロールを含むグリッドを含むユーザーコントロールがあります。

ユーザーコントロールの背後にあるコードから子コントロールへの参照を取得したいと思います。

これは私が持っているものです:

var childControl = (MyChildControlType)this.Grid.Children.Single(c => (string) c.GetValue(NameProperty) == "MyChildControlNameFromXAMLNameAttribute");

ゴミ箱用ふたのように醜い。

これを行うためのより良い方法は何ですか?

4

3 に答える 3

5

すでに提案されていることに沿って、名前を探すこともできます。

var childControl = (MyChildControlType)this.Grid.FindName("MyChildControlNameEtc");

または、すでに試していることに対してより一般的なアプローチが必要な場合(たとえば、別のプロパティで検索したい場合)、次のことを試すことができます。

var childControl = (MyChildControlType)this.Grid.Children.OfType<FrameworkElement>().Single(f => f.Name == "Blah");

また

var childControl = (MyChildControlType)this.Grid.Children.OfType<MyChildControlType>().Single(f => f.Name == "Blah");

または、非グリッドで機能するVisualTreeHelperを使用することもできます。これは、ビジュアルツリーを再帰的に実行する必要がある場合に特に効果的です。

for(int i = 0; i < VisualTreeHelper.GetChildrenCount(this.Grid); ++i)
{
    var child = VisualTreeHelper.GetChild(this.Grid, i) as FrameworkElement;
    if (child != null && child.Name == "Blah")
        return child;
}

しかし、実際には、John Bowenが言ったように、名前を付けてコードビハインドからアクセスできるのであれば、これがはるかに簡単です。

于 2013-02-13T01:16:34.693 に答える
2

XAMLの要素にNameまたはx:Nameを割り当てると(テンプレート内にある場合を除く)、その要素は、その名前のフィールドとしてコードビハインドからアクセスできるようになります。したがって、これは基本的に、InitializeComponent中にすでに宣言され、入力されています。

MyChildControlType MyChildControlNameFromXAMLNameAttribute;

そしてあなたはそれを直接使うことができます:

MyChildControlNameFromXAMLNameAttribute.Visibility = Visibility.Hidden;
于 2013-02-12T13:32:14.120 に答える
1

これかもしれません、あなたのchildControlにx:Nameを与えてください

 var childControl = (MyChildControlType)MyGridNameFromXAMLNameAttribute.FindName("MyChildControlNameFromXAMLNameAttribute");
于 2013-02-12T04:20:57.950 に答える