2012-05-23 3 views
1

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

<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? Или это неправильный подход?

Спасибо заранее,
Frank

ответ

2

Я бы рекомендовал создать пользовательский элемент управления, который наследуется от ContentControl. Вот хороший blog post talking about UserControls and custom controls

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

+0

Привет Шон, спасибо за совет! Я, наконец, решил попробовать использовать ContentControl. Я пытался избежать этого, потому что мне не нужны все функции, такие как шаблоны и т. Д. Единственным недостатком UserControl является то, что вы не можете добавить к нему дочерний элемент управления. ContentControl-Design, по-видимому, немного испорчен для меня: что делать, если я хочу использовать несколько элементов управления? Мне нужно будет скопировать xaml в Generic.xaml для каждого ... – Aaginor

+0

Aaginor, что вы подразумеваете под «несколькими элементами управления»? Вы можете поместить несколько контента в элемент управления контентом, если эти элементы управления обернуты в Grid или другой тип Panel. –

+0

Я имел в виду разные пользовательские элементы управления в проекте. Насколько я понимаю, XAML-часть пользовательского элемента управления должна быть в файле Generic.xaml. Поэтому, если я использую разные пользовательские элементы управления, мне нужно будет скопировать xaml-часть каждого элемента управления в файле Generic.xaml. – Aaginor

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