2010-12-30 2 views
1

Silverlightで、Left、Middle、Rightの3つのTextBlock要素を持つカスタムコントロールがあるとします。私は3つの列を持つグリッドの内部にコントロールを配置したいと思います。Grid.Column = "x"構文を使用してインラインでGrid.Rowを定義した場合と同じように、それらの要素の位置を同じにしたいと思います添付プロパティはカスタムコントロール自体に設定されています。Silverlight CustomControlでは、コントロールを含むグリッドに従って、そのコントロールの要素をレイアウトする方法はありますか?

また、私が完全にオフベースの場合は、同様の結果を得るための最良の方法は何ですか。

+0

まず、カスタムコントロールの要件があると思われる理由をまず定義する必要があります。 – AnthonyWJones

+0

最初から具体的な例があるはずです。 1.サードパーティは、MEFを介して読み込んでGirdレイアウト内に配置するコントロールを提供し、定義した要素をホストと一致する列に配置します。 2.エンティティプロパティにバインドする[Label - TextBox - DescriptionViewer]コントロール。我々はこれらの何百ものを書いて、彼らが全面的に一貫していてほしいと思っています。また、このアプローチのXAML構文は、私にとってははるかに読みやすくなっています。 –

答えて

1

私はその可能性が高いと思う "オフベース"です。カスタムコントロールの目的は、独自の方法でデータを提示することです。レイアウトを外部グリッドに渡したい場合は、カスタムコントロールを呼び出す必要はありません。

単純に3つのTextBlockをバインドする3つのプロパティを持つクラスが必要になる可能性が高くなります。それ以上のアドバイスを与えるのは難しいです。

あなたの実際の質問に答えるには、できません。グリッドがレイアウトを担当するには、個々の要素をグリッドの子コレクションに直接追加する必要があります。これは、これらの要素をカスタムコントロール内の子ビジュアル要素として表示できないことを意味します。

0

私が最初に考えたのは、あなたがオフベースだということでした:)しかし、あなたはその解決策を模索する正当な理由が必要です。

CustomControlでは、OnApplyTemplateをオーバーライドします。このメソッドでは、3つのTextBlockを検索し、SetValueを使用してGrid.Column値を設定できます。

public override void OnApplyTemplate() 
{ 
    base.OnApplyTemplate(); 

    /// Find TextBlock named "Left" 
    var left = GetTemplateChild("Left") as TextBlock; 
    left.SetValue(Grid.ColumnProperty, 0); 

    ... 
} 
+0

これはうまくいきません。 TextBlockはGrid Childrenコレクションのメンバーではないため、Gridによってレイアウトされることはありません。 – AnthonyWJones

+0

私はSOの新人です - 私はこれ以上のことを受け入れようとしました。技術的には、XAMLではこれが不可能だと私は思っていますが、正しく使用すると強力なものになる可能性があるという欠点だと思います。この効果を得るための最良の方法は、おそらくこの答え\のようなものですが、もう少し複雑になると思います。キューを取りたいレイアウト要素を渡してから、その要素のレイアウトイベントに応答してください。回答ありがとう。 –

関連する問題