2016-04-19 4 views
0

Я предполагаю, что это, вероятно, легкая ошибка, которую я делаю где-то. У меня есть пользовательский элемент управления, усеченную к основам:Содержание, перекрывающее весь пользовательский контроль, а не ContentPresenter

<local:CustomUserControl x:Class="Test.UI.CustomUserControl" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      xmlns:local="clr-namespace:Test.UI" 
      mc:Ignorable="d" 
      d:DesignHeight="300" d:DesignWidth="300" 
      IsEnabled="True" Loaded="CustomUserControl_Loaded"> 

    <!-- Main border --> 
    <Border BorderBrush="#9B000000" BorderThickness="1" Margin="0,0,0,0" Padding="0"> 

     <Grid Margin="0" Name="outerGrid"> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="*" /> 
      </Grid.ColumnDefinitions> 
      <Grid.RowDefinitions> 
       <RowDefinition Height="Auto" /> 
       <RowDefinition Height="Auto" /> 
      </Grid.RowDefinitions> 

      <Grid Margin="0" Grid.Row="0" Grid.Column="0" Name="innerGrid"> 
       <Grid.ColumnDefinitions> 
        <ColumnDefinition Width="*" /> 
        <ColumnDefinition Width="Auto" /> 
       </Grid.ColumnDefinitions> 
       <Grid.RowDefinitions> 
        <RowDefinition Height="Auto" /> 
       </Grid.RowDefinitions> 

       <!-- Backgound --> 
       <Rectangle Fill="#FF5B87B8" Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="2" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" Name="headerRectangle" PreviewMouseLeftButtonUp ="headerRectangle_MouseLeftButtonUp" /> 

       <!-- Text --> 
       <Label Grid.Row="0" Grid.Column="0" HorizontalContentAlignment="Left" VerticalContentAlignment="Center" Name="HeaderLabel" Content="Hello" Margin="5,0,0,0" Foreground="White" FontSize="18" Background="#FF5B87B8" PreviewMouseLeftButtonUp ="HeaderLabel_MouseLeftButtonUp" /> 

      </Grid> 

      <!-- Content --> 
      <ContentPresenter Name="MainContent" Grid.Row="1" Grid.Column="0" Content="{Binding Content}" /> 

     </Grid>  
    </Border>  
</local:CustomUserControl> 

При отображении на форме, как следующий, он рисует коробку с затененной сверху, с белым текстом:

<ui:CustomUserControl Grid.Row="0" Grid.Column="2" Name="borderDiagram" Header="Hello" /> 

Example 1

Но, если я пытаюсь добавить содержимое в ContentPresenter:

<ui:CustomUserControl Grid.Row="0" Grid.Column="2" Name="borderDiagram" Header="Hello"> 
    <Label Content="Um..." /> 
</ui:CustomUserControl > 

Он отменяет весь пользовательский элемент управления, оставляя только метку «Um ...».

Worlds worst screenshot

Я полагаю, я управляю, чтобы отменить полный контроль, когда я установить содержание, так как это один убедитесь, что это ContentPresenter, который принимает содержание, а не родительского контроля?

ответ

1

CustomUserControl имеет некоторые по умолчанию Содержание:

<!-- Main border --> 
<Border> ... 
</Border> 

и Content заменяется <Label Content="Um..." />

, чтобы заставить его работать, как ожидалось (Ярлык отображается в ContentPresenter), вы должны определить шаблон по умолчанию:

<UserControl.Template> 
    <ControlTemplate TargetType="UserControl"> 
     <Border BorderBrush="#9B000000" BorderThickness="1" Margin="0,0,0,0" Padding="0"> 
      <Grid Margin="0" Name="outerGrid"> 
      ... 
       <!-- Content --> 
       <ContentPresenter Name="MainContent" Grid.Row="1" Grid.Column="0" 
            Content="{TemplateBinding Content}" /> 
      </Grid> 
     </Border> 
    </ControlTemplate> 
</UserControl.Template> 

Обращаем внимание на одно важное изменение:

Content="{TemplateBinding Content}" 

ContentPresenter использует шаблон привязки для получения и отображения пользовательского контента

+0

Отлично, спасибо you.I предположить, следует один хочет, чтобы добавить свойство (скажем, тумблер), один, то нужно будет использовать DependencyObjects и триггеры? –

+0

@RobbieC, безусловно, это должен быть DependencyProperty (UserControl наследует DependencyObject). Использовать триггеры или нет, зависит от типа переключения – ASh

+0

И сделано. Спасибо за помощь. :) –

Смежные вопросы