1

入れ子になったカスタム 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 />だと思いますが、何に置き換えればよいかわかりません。提案?

4

0 に答える 0