2012-05-03 6 views
44

Я пытаюсь создать пользовательский элемент управления, который имеет Grid с двумя строками. первая строка для заголовка и вторая для содержимого, которое будет определено вне пользовательского элемента управления, например Button в нашем примере.WPF - Хостинг содержимого внутри UserControl

Как-то я не получил его на работу.

UserControl1 XAML:

<Grid Background="LightBlue"> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="50" /> 
     <RowDefinition Height="*" /> 
    </Grid.RowDefinitions> 
    <TextBlock Text="Title" FontSize="30" Margin="10,0,0,0"/> 
</Grid> 

MainWindow XAML:

<Grid> 
    <local:UserControl1> 
     <Button>Click me</Button> 
    </local:UserControl1> 
</Grid> 

На рисунке ниже следует объяснить, что это моя проблема: enter image description here

ответ

53

Следующий код

<local:UserControl1> 
    <Button>Click me</Button> 
</local:UserControl1> 

Значения, которые вы задали UserControl1. Эта кнопка просто заменяет разметку UserControls1. Итак, все, что у вас есть в UserControl1.xaml, больше не существует.

EDIT

Если вы хотите, чтобы ваш UserControl провести некоторую разметку, который будет установлен где-то за пределами этого, вы можете добавить DependencyProperty к нему, например:

/// <summary> 
    /// Gets or sets additional content for the UserControl 
    /// </summary> 
    public object AdditionalContent 
    { 
     get { return (object)GetValue(AdditionalContentProperty); } 
     set { SetValue(AdditionalContentProperty, value); } 
    } 
    public static readonly DependencyProperty AdditionalContentProperty = 
     DependencyProperty.Register("AdditionalContent", typeof(object), typeof(CalibrationPoint), 
      new PropertyMetadata(null)); 

И добавить некоторые элемент к его разметке для размещения этого дополнительного контента. Вот пример расширения разметки вы предоставили:

<UserControl ... Name="userControl"> 
    <Grid Background="LightBlue"> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="50" /> 
      <RowDefinition Height="*" /> 
     </Grid.RowDefinitions> 

     <TextBlock Text="Title" FontSize="30" Margin="10,0,0,0"/> 
     <ContentPresenter Content="{Binding AdditionalContent, ElementName=userControl}" /> 
    </Grid> 
</UserControl> 

Теперь вы можете использовать его следующим образом:

<local:UserControl1> 
    <local:UserControl1.AdditionalContent> 
     <Button>Click me</Button> 
    </local:UserControl1.AdditionalContent> 
</local:UserControl1> 
+1

Зачем использовать дополнительное свойство зависимостей, а не просто заменять шаблон управления и привязываться к свойству содержимого? – codekaizen

+0

Я согласен с тобой. Я видел ваш ответ сразу после того, как я разместил свой. Это я голосовал за вас – EvAlex

+0

Объяснение, почему это не работает, замечательно, но я нашел ответ @ blindmeis более полезным. – TarkaDaal

21

Вы должны установить ControlTemplate:

<UserControl> 
<UserControl.Resources> 
    <Style TargetType="{x:Type local:UserControl1}"> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type local:UserControl1}"> 
        <Grid Background="LightBlue"> 
         <Grid.RowDefinitions> 
          <RowDefinition Height="50" /> 
          <RowDefinition Height="*" /> 
         </Grid.RowDefinitions> 
         <TextBlock Grid.Row="0" Text="Title" FontSize="30" Margin="10,0,0,0"/> 
         <ContentPresenter Grid.Row="1" /> 
        </Grid> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 
</UserControl.Resources> 
</UserControl> 
+8

Есть ли причина, по которой вы устанавливаете ее через 'UserControl.Resources/Style' вместо того, чтобы просто помещать' ControlTemplate' в качестве содержимого 'UserControl.Template'? – LWChris

+1

К сожалению, похоже, что свойство 'Template'' UserControl' не поддерживается: https://social.msdn.microsoft.com/forums/silverlight/en-US/a41ff344-1760-4e2d-afc2- 67307372b584/how-can-set-usercontrols-template-in-xaml –

+0

UserControl.Template работает для меня. Я использую TargetType = "{x: Тип UserControl}". –

3

Вы можете шаблон пользователя чтобы добавить дополнительные визуальные эффекты, например, TextBlock.

<UserControl> 
<UserControl.Style> 
    <Style TargetType="{x:Type UserControl}"> 
    <Setter Property="Template"> 
     <Setter.Value> 
     <ControlTemplate>    
      <Grid Background="LightBlue"> 
      <Grid.RowDefinitions> 
      <RowDefinition Height="50" /> 
      <RowDefinition Height="*" /> 
      </Grid.RowDefinitions> 
      <TextBlock Text="Title" FontSize="30" Margin="10,0,0,0"/> 
      <ContentPresenter Grid.Row="1" Content="{TemplateBinding Content}" /> 
      </Grid> 
     </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
    </Style> 
</UserControl.Style> 
<Button> 
    Click me! 
</Button> 
</UserControl> 
7

Использование шаблона с

< ContentControl />

Вместо использования Content Presenter

Так поместить это:

<UserControl.Style> 
     <Style TargetType="{x:Type UserControl}"> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate TargetType="{x:Type UserControl}" > 
          <Grid Background="LightBlue"> 
          <Grid.RowDefinitions> 
          <RowDefinition Height="50" /> 
          <RowDefinition Height="*" /> 
          </Grid.RowDefinitions> 
          <TextBlock Text="Title" FontSize="30" Margin="10,0,0,0"/> 

         <ContentControl Grid.Row="1" Content="{TemplateBinding Content}" /> 

         </Grid> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 
    </UserControl.Style> 

to your userControl

+0

* Используйте шаблон с ContentControl вместо использования ContentPresenter * - Почему? – Crono

+0

Лучше использовать ContentPresenter внутри шаблонов, см. Http://stackoverflow.com/a/1288353/991267 –

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