3

我正在尝试在 WPF/XAML 中创建一个“标题块”用户控件,具有以下行为:

  • 控件本身是一个包含 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>

渲染这样的东西:

在此处输入图像描述

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

  • 我不知道(也没有通过搜索找到)如何使控件具有“子容器”,我可以在其中通过直接嵌套在 XAML 中添加子容器;
  • 我不知道如何为用户控件的每个实例绑定不同的标题,无论是通过 XAML 属性还是绑定(最好),无论是通过代码后面。编写上述代码会创建无效的 xaml 代码,这并不奇怪,因为“Title”属性还不存在。

谢谢阅读!

4

2 回答 2

4
  1. 您可以创建从 ContentControl 继承的控件并为其添加模板
  2. 如果您想访问您在 xaml 中的自定义属性作为属性,您需要将其注册为 DependencyProperty(请参阅在此处输入链接描述
于 2013-01-14T11:20:25.213 回答
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>
于 2013-01-14T12:45:50.853 回答