2013-03-11 4 views
0

У меня есть следующий пользовательский элемент управления:Как вы разрешаете нескольким дочерним элементам UserControl?

<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="Auto"/> 
     <RowDefinition Height="*"/> 
    </Grid.RowDefinitions> 
<Label Grid.Row="0" Content="USER CONTROL" HorizontalAlignment="Stretch" HorizontalContentAlignment="Center" Name="label1" 
     VerticalAlignment="Top" FontSize="26" Padding="0"/>   
<ScrollViewer Grid.Row="1" VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Disabled"> 
    <Border BorderBrush="Black" BorderThickness="1"> 
     <DockPanel x:Name="dPanel" Background="White">    
     </DockPanel> 
    </Border> 
</ScrollViewer>   
</Grid> 

Когда я использую следующий код XAML в моем MainWindow.xaml:

<local:UserDockPanel> 
    <Label ...> 
    <Label ...> 
</local:UserDockPanel> 

Он говорит, что я не могу иметь больше одного ребенка.

Мой первый вопрос: должен ли я использовать UserControl или использовать пользовательский контроль? Я думал, что UserControl будет лучше для моей ситуации, когда у меня есть ярлык, а также Border и Scrollviewer над моей DockPanel.

Кроме того, по моему мнению, панель нельзя шаблонировать. Он выглядит неважно и поэтому не имеет стиля.

Второй вопрос: Если я должен использовать UserControl, как я могу сделать так, чтобы на панель док-станции можно было добавить более одного ребенка?

ответ

1

Вы можете сделать это с ItemsControl, нет необходимости в создании подкласса ничего или создать свой собственный:

<Window x:Class="WpfApplication4.Window16" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="Window16" Height="300" Width="300"> 
    <Window.Resources> 
     <Style TargetType="ItemsControl" x:Key="UserDockPanelStyle"> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate TargetType="ItemsControl"> 
         <Grid> 
          <Grid.RowDefinitions> 
           <RowDefinition Height="Auto"/> 
           <RowDefinition Height="*"/> 
          </Grid.RowDefinitions> 
          <Label Grid.Row="0" Content="USER CONTROL" HorizontalAlignment="Stretch" HorizontalContentAlignment="Center" Name="label1" 
               VerticalAlignment="Top" FontSize="26" Padding="0"/> 
          <ScrollViewer Grid.Row="1" VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Disabled"> 
           <Border BorderBrush="Black" BorderThickness="1"> 
            <ItemsPresenter/> 
           </Border> 
          </ScrollViewer> 
         </Grid> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
      <Setter Property="ItemsPanel"> 
       <Setter.Value> 
        <ItemsPanelTemplate> 
         <DockPanel IsItemsHost="True" Background="White"/> 
        </ItemsPanelTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 
    </Window.Resources> 

    <ItemsControl Style="{StaticResource UserDockPanelStyle}"> 
     <Label DockPanel.Dock="Bottom" Content="Bottom"/> 
     <Label DockPanel.Dock="Top" Content="Top"/> 
     <Border Background="Blue"/> 
    </ItemsControl> 
</Window> 
+0

Это идеальный вариант! В любом случае, я могу заставить вас объяснить, что здесь происходит? Однако я понимаю некоторые из них, мне бы очень хотелось узнать, как это работает. –

+1

Вы создаете пользовательский 'ControlTemplate' для' ItemsControl', а затем устанавливаете его 'ItemsPanelTemplate' в' DockPanel'. –

+0

Очень круто. Я понятия не имел, что вы можете так поступить. –