嵌套的ContentControls与模板

时间:2014-10-10 08:30:32

标签: wpf datatemplate contentpresenter wpf-style contenttemplate

我有一个自定义 WindowStyle ,XAML看起来像这样:

    <Style TargetType="{x:Type Window}"
       x:Key="WindowStyle">
    /** Some setters **/
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="ContentControl">
                <AdornerDecorator>
                    <Grid Background="#88000000"
                          x:Name="WindowBackgroundGrid">
                        <Border x:Name="WindowContentBorder"
                                Background="{DynamicResource WindowBackground}"MaxHeight="{Binding Source={x:Static SystemParameters.FullPrimaryScreenHeight}}"
                                MaxWidth="{Binding Source={x:Static SystemParameters.FullPrimaryScreenWidth}}"
                                Margin="20">
                            <Grid>
                                <Grid.RowDefinitions>
                                    <RowDefinition Height="Auto" />
                                    <RowDefinition Height="*" />
                                </Grid.RowDefinitions>

                                <!-- Header -->
                                <Border BorderBrush="{DynamicResource BorderBrushColor}"
                                        Background="{DynamicResource PaneHeader_Background}"
                                        Grid.Row="0">
                                    <TextBlock Text="Title"Foreground="{DynamicResource DefaultForeground}"
                                               FontSize="16"
                                               FontWeight="Bold"
                                               Margin="5,5,2,5" />
                                </Border>

                                <!-- Content -->
                                <ScrollViewer Grid.Row="1"
                                              Margin="5">
                                    <ContentPresenter Content="{TemplateBinding Content}" />
                                </ScrollViewer>
                            </Grid>
                        </Border>
                    </Grid>
                </AdornerDecorator>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

现在我希望内部Grid处于单独的Style中,以便我可以在其他地方使用它。

 <Style x:Key="WindowContentStyle"
       TargetType="{x:Type ContentPresenter}">
    <Setter Property="ContentTemplate">
        <Setter.Value>
            <DataTemplate>
                <Grid>
                    <Grid.RowDefinitions>
                        <RowDefinition Height="Auto" />
                        <RowDefinition Height="*" />
                    </Grid.RowDefinitions>

                    <!-- Header -->
                        /** Border control **/
                    <!-- Content -->
                    <ScrollViewer Grid.Row="1" 
                                  Margin="5">
                        <ContentPresenter Content="{Binding Content, RelativeSource={RelativeSource TemplatedParent}}" />
                    </ScrollViewer>
                </Grid>
            </DataTemplate>
        </Setter.Value>
    </Setter>
</Style>

我在 WindowStyle 中使用ContenPresenter来呈现它:

<ContentPresenter>
    <ContentPresenter.Style>
        <Style TargetType="{x:Type ContentPresenter}"
               BasedOn="{StaticResource WindowContentStyle}" />
    </ContentPresenter.Style>
</ContentPresenter>

问题

上面的编辑没有给我任何错误,但它没有显示我的 WindowContentStyle 。 当我设置Content控件的Window属性并加载样式

this.window.Content = view;
this.window.Style = (Style)Application.Current.TryFindResource("WindowStyle");

内容显示在 WindowStyle ContentPresenter中,而不是 WindowContentStyle 中。因此,Template未使用,我没有带标题的标题。

如何将ContentPresenter的{​​{1}}外部Content传递到我的内部ContentPresenter WindowContentStyle 中的那个)?

提前致谢!

问候 Loetn

1 个答案:

答案 0 :(得分:1)

您应该使用ContentControl来显示您的内容,不是 ContentPresenter。来自MSDN上的ContentPresenter Class页:

  

您通常使用ContentPresenterControlTemplate中的ContentControl 来指定要添加内容的位置。

来自MSDN上的ContentControl Class页:

  

ContentControl的默认样式有限。如果要增强控件的外观,可以创建新的DataTemplate