使用XAML创建WPF UserControl,以便我可以在其中嵌套子控件

时间:2013-01-14 10:46:18

标签: wpf xaml data-binding wpf-controls

我正在尝试在WPF / XAML中创建一个“标题块”UserControl,其行为如下:

  • 控件本身是一个包含DockPanel的Border。 DockPanel包含一个顶部对齐的“标题”TextBlock,此DockPanel的其余部分应该是“子窗口小部件区域”。

控制声明如下:

<Border x:Name="LayoutRoot" Background="#4C000000" CornerRadius="10" Padding="10">
    <DockPanel>
        <TextBlock Text="Some Title" DockPanel.Dock="Top" />
    </DockPanel>
</Border>

预期用法是这样的:

<Grid x:Name="LayoutRoot" Background="White">
    <local:Bloco Height="100" Width="100" Title="Other Title">
        <local:Bloco Title="Yet other title" />
    </local:Bloco>
</Grid>

要渲染这样的东西:

enter image description here

但实际当前渲染无效。问题是:

  • 我不知道(并没有通过搜索找到)如何让控件有一个“子容器”,我可以通过直接嵌套在XAML中添加子项;
  • 我不知道如何为每个用户控件实例绑定不同的标题,无论是通过XAML属性还是绑定(可选),都可以通过代码隐藏。如上所述编写代码会产生无效的xaml代码,这不足为奇,因为“Title”属性尚不存在。

感谢阅读!

2 个答案:

答案 0 :(得分:4)

  1. 您可以创建从ContentControl继承并为其添加模板的控件
  2. 如果您想要在xaml中访问自定义属性作为属性,则需要将其注册为DependencyProperty(请参阅enter link description here

答案 1 :(得分:3)

通用用户控件:

XAML:

<UserControl x:Class="WpfControlLibrary.GenericUserControl"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:local="clr-namespace:WpfControlLibrary"
         mc:Ignorable="d" 
         d:DesignHeight="300" d:DesignWidth="300" x:Name="Control">
<UserControl.Resources>
    <Style TargetType="{x:Type local:GenericUserControl}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type local:GenericUserControl}">
                    <Grid Background="{Binding Background, ElementName=Control}">
                        <Grid.RowDefinitions>
                            <RowDefinition Height="5"></RowDefinition>
                            <RowDefinition Height="20"></RowDefinition>
                            <RowDefinition Height="*"></RowDefinition>
                            <RowDefinition Height="5"></RowDefinition>
                        </Grid.RowDefinitions>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="5"/>
                            <ColumnDefinition Width="*"/>
                            <ColumnDefinition Width="5"/>
                        </Grid.ColumnDefinitions>
                        <TextBlock Grid.Column="1" Grid.Row="1" Text="{Binding Title, ElementName=Control}"/>
                        <ContentPresenter Grid.Column="1" Grid.Row="2"/>
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</UserControl.Resources>

代码背后:

namespace WpfControlLibrary
{
   public partial class GenericUserControl
   {
      public string Title
     {
        get { return (string)GetValue(TitleProperty); }
        set { SetValue(TitleProperty, value); }
     }

     public static readonly DependencyProperty TitleProperty =
      DependencyProperty.Register("Title", typeof(string), typeof(GenericUserControl), new PropertyMetadata(string.Empty));

public GenericUserControl()
     {
        InitializeComponent();
     }
   }
}

而不是像这样使用用户控件:

    <wpfControlLibrary:GenericUserControl Title="Other Title" Background="LightGray">
       <wpfControlLibrary:GenericUserControl Title="Yet Another Title" Background="Gray"/>
</wpfControlLibrary:GenericUserControl>