入れ子になったカスタム ContentControls がありますが、内側のコントロールを外側のコントロールの内側にレンダリングするのに苦労しています。2 つのコントロールの構成例を次に示します。
<Window ...>
<StackPanel>
<local:Outer> <!-- Nothing in here gets displayed -->
<local:Inner>
<TextBlock>Fahrvergnügen</TextBlock>
</local:Inner>
</local:Outer>
<local:Inner> <!-- This is displayed just fine -->
<TextBlock>some text</TextBlock>
</local:Inner>
</StackPanel>
</Window>
内側と外側のスタイルは次のように定義されています。
<ResourceDictionary ...>
<Style TargetType="{x:Type local:Outer}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type local:Outer}">
<ContentPresenter />
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<Style TargetType="{x:Type local:Inner}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type local:Inner}">
<ContentPresenter />
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ResourceDictionary>
追加のしわは、Outer が List を指す ContentPropertyAttribute を使用していることです。
[ContentPropertyAttribute("InnerItems")]
public class Outer : ContentControl
{
private List<Inner> innerItems = new List<Inner>();
static Outer()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(Outer), new FrameworkPropertyMetadata(typeof(Outer)));
}
public List<Inner> InnerItems { get { return this.innerItems; } }
}
完全を期すために、Inner の定義を次に示します。これは簡単です。
public class Inner : ContentControl
{
static Inner()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(Inner), new FrameworkPropertyMetadata(typeof(Inner)));
}
}
問題は、アウターのコンテンツをシンプルに表示できないこと<ContentPresenter />
だと思いますが、何に置き換えればよいかわかりません。提案?