1
<ContentControl Content="Test">
    <ContentControl.ContentTemplate>
        <DataTemplate>
            <Border>
                <ContentPresenter />
            </Border>
        </DataTemplate>
    </ContentControl.ContentTemplate>
</ContentControl>

It throws stackoverflow exception. However if i use any other control else than ContentPresenter it works fine even ItemPresenter also works.I knows it doesnt make any sense to have ContentPresenter there but just for Knowledge want to know. Why it throws StackOverFlow exception and also Why does Intellisense shows it can be added(I mean it comes there in Intellisense that means syntatically its not wrong to have ContentPresenter there). Any help will be highly appericiated. Or is it any flaw in Wpf.

4

1 に答える 1

0

ContentPresenterの MSDN ページには次のように書かれています。

ContentPresenter オブジェクトが ContentControl の ControlTemplate にある場合、Content、ContentTemplate、および ContentTemplateSelector プロパティは、ContentControl の同じ名前のプロパティから値を取得します。ContentSource プロパティを設定するか、それらにバインドすることにより、ContentPresenter プロパティにテンプレート化された親の他のプロパティからこれらのプロパティの値を取得させることができます。

ContentTemplate の ContentPresenter にテンプレートを適用しようとし続け、その中の次のテンプレート、その中のテンプレートなどに適用しようとするため、StackOverflow が発生すると思います。

次のようなこともできるので、IntelliSense はおそらくこれらの種類のシナリオをチェックしませんが、このパターンが常に間違っているとは限りません。

<ContentControl Content="Test"> 
    <ContentControl.ContentTemplate> 
        <DataTemplate> 
            <Border> 
                <ContentPresenter ContentStringFormat="{}{0}" />
            </Border> 
        </DataTemplate> 
    </ContentControl.ContentTemplate> 
</ContentControl> 
于 2012-08-06T00:01:33.263 に答える