3

次の動作で、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>

このようなものをレンダリングするには:

ここに画像の説明を入力

ただし、実際の現在のレンダリングは無効です。問題は次のとおりです。

  • 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 に答える