Создайте пользовательский элемент управления, который может содержать дочерний элемент (например, 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? Или это неправильный подход?

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


person Aaginor    schedule 23.05.2012    source источник


Ответы (1)


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

Вам нужно будет создать «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>

person Shawn Kendrot    schedule 23.05.2012
comment
Привет, Шон, спасибо за подсказку! Наконец я решил попробовать использовать ContentControl. Я старался избегать этого, потому что мне не нужны все функции, такие как создание шаблонов и тому подобное. Единственным недостатком UserControl является то, что вы не можете добавить к нему дочерний элемент управления. ContentControl-Design мне кажется немного несовершенным: что, если я хочу использовать несколько элементов управления? Мне нужно было бы скопировать xaml в Generic.xaml для каждого ... - person Aaginor; 25.05.2012
comment
Aaginor, что вы имеете в виду под несколькими элементами управления? Вы можете поместить несколько материалов в элемент управления содержимым, если эти элементы управления заключены в сетку или другой тип Panel. - person Shawn Kendrot; 25.05.2012
comment
Я имел в виду разные пользовательские элементы управления в проекте. Насколько я понимаю, часть XAML пользовательского элемента управления должна находиться в файле Generic.xaml. Итак, если я использую разные настраиваемые элементы управления, мне нужно будет скопировать xaml-часть каждого элемента управления в файл Generic.xaml. - person Aaginor; 05.06.2012
comment
Это один из способов сделать это. Другой - разместить xaml в разных файлах и собрать их вместе в главном Themes \ Generic.xaml. Какой бы вариант вы ни выбрали, в нем могут быть и другие элементы управления. - person Shawn Kendrot; 05.06.2012