2014-10-10 151 views
0

我有一個自定義WindowStyle,在XAML看起來是這樣的:嵌套ContentControls與模板

<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> 

現在我想在一個單獨的StyleGrid,這樣我可以在其他地方使用它。

<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> 

而且我用的是ContenPresenter在我WindowStyle呈現它:

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

問題

編輯上面沒有給我任何錯誤,但它不」 t目前我的WindowContentStyle。 當我設置Window控制的Content屬性並加載樣式

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

內容被顯示在ContentPresenterWindowStyle,而不是在WindowContentStyle。因此,Template沒有使用,我沒有標題的標題。

我怎樣才能讓我的外ContentPresenter通上Content到我的內心ContentPresenter(在WindowContentStyle之一)?

在此先感謝!

問候 Loetn

回答

1

您應該使用ContentControl顯示您的內容,一個ContentPresenter。從ContentPresenter Class頁面上MSDN:

您通常使用ContentPresenter中的ContentControlControlTemplate到指定的內容將被添加。

ContentControl Class頁面上MSDN:

一個ContentControl具有有限的默認樣式。如果您想增強控件的外觀,您可以創建一個新的DataTemplate

+0

感謝您的建議。我編輯了我的外部'ContentPresenter'到'ContentControl'(或者你的意思是內部的'ContentPresenter'?)。它確實顯示我的標題,但不顯示任何內容。任何想法如何設置*內容綁定*? – Loetn 2014-10-10 09:45:57

+0

我的意思是你應該只使用一個'ContentPresenter'來呈現內容。您不應該嘗試對該內容進行「樣式」設置,因爲「樣式」選項有限,無論如何都不會傳遞給實際內容。你應該在所有其他情況下使用ContentControl,你可以使用ContentControl.Content屬性來設置內容和ContentControl.ContentTemplate屬性(http://msdn.microsoft.com/)com/en-us/library/system.windows.controls.contentcontrol.contenttemplate(v = vs.110).aspx)來應用你的'DataTemplate'。 – Sheridan 2014-10-10 10:54:44