Создайте пользовательский элемент управления, который может содержать дочерний элемент (например, Border-Element)

В моем приложении Silverlight 4 я хочу создать простой пользовательский элемент управления, который помимо прочего может содержать другой элемент управления. Примером того, что я хочу, является пограничный контроль. Вы можете поместить любой другой элемент управления (точно ОДИН другой элемент управления) "в" Border-Control, чтобы Border-Control содержал другой пользовательский элемент управления и отображал его содержимое. Что мне нужно сделать, чтобы создать пользовательский элемент управления с этой возможностью? Идея состоит в том, чтобы поместить другой элемент управления в ContentPresenter в мой пользовательский элемент управления, например:

<Grid x:Name="LayoutRoot">
  <Grid.RowDefinitions>
    <RowDefinition Height="Auto" />
    <RowDefinition />
  </Grid.RowDefinitions>

  <TextBlock x:Name="TextBlockHeader" Text="{Binding Title, ElementName=userControl}" HorizontalAlignment="Left" Foreground="White" Margin="5,0"/>
  <ContentPresenter x:Name="ContentPresenterObject" Grid.Row="1" />
</Grid>

Теперь, что нужно сделать, чтобы иметь возможность добавить (в Expression Blend) дочерний элемент управления в мой UserControl и как связать его с ContentPresenter? Или это неправильный подход?

Заранее спасибо,
Фрэнк

1 ответ

Решение

Я бы порекомендовал создать пользовательский элемент управления, который наследуется от ContentControl. Вот хороший пост в блоге, рассказывающий о пользовательских элементах управления и пользовательских элементах управления.

Вам нужно будет создать "Generic.xaml", который определит ваш xaml, и класс cs, который определит ваш класс.

public class CustomControl: ContentControl
{
    public CustomControl()
    {
        this.DefaultStyleKey = typeof(CustomControl);
    }
}

Ваш класс xaml будет выглядеть примерно так:

<ResourceDictionary
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:MyApp">

<Style TargetType="local:CustomControl">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="local:CustomControl">
                <Grid x:Name="LayoutRoot">
                    <Grid.RowDefinitions>
                        <RowDefinition Height="Auto" />
                        <RowDefinition />
                    </Grid.RowDefinitions>
                    <TextBlock x:Name="TextBlockHeader" Text="{Binding Title,
                               ElementName=userControl}" HorizontalAlignment="Left" 
                               Foreground="White" Margin="5,0"/>
                    <ContentPresenter x:Name="ContentPresenter" Grid.Row="1"
                                      Content="{TemplateBinding Content}"
                                      ContentTemplate="{TemplateBinding ContentTemplate}"
                                      VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
                                      HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" />
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

Другие вопросы по тегам