1

カスタム コントロール用に次のコントロール テンプレートを定義しました。

<ControlTemplate TargetType="{x:Type local:CustomControl}">
    <Grid x:Name="MainGrid">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*" />
            <ColumnDefinition Width="Auto" />
        </Grid.ColumnDefinitions>
        <local:CustomPanel x:Name="MyCustomPanel" Grid.Column="0" />
        <ScrollBar Grid.Column="1" Width="20" />
    </Grid>
</ControlTemplate>

ここで、CustomPanel はフォーム Panel クラスから派生します。今、このように CustomControl にアイテムを直接追加することはできません

<local:CustomControl x:Name="CControl" Grid.Row="1">
    <Button/>
    <Button/>
    <Button/>
</local:CustomControl>

XAML から直接カスタム コントロールに項目を追加するにはどうすればよいですか?

4

2 に答える 2

3

CustomControl で[ContentProperty(PropertyNameを使用します。)]

そして: content プロパティが空のリストに初期化されていることを確認してください ( であってはなりませんnull)。

例えば:

[ContentProperty("Items")]
public class CustomControl : UserControl
{

    public static readonly DependencyProperty ItemsProperty =
        DependencyProperty.Register("Items", typeof(UIElementCollection), typeof(CustomControl), new UIPropertyMetadata(null)));

    public UIElementCollection Items     
    {     
        get { return (UIElementCollection) GetValue(ItemsProperty); }     
        set { SetValue(ItemsProperty, value); }     
    }   

    public CustomControl()
    {
        Items = new UIElementCollection();
    }

}

重要:依存関係プロパティの登録内に空のコレクションを作成しないでください。つまり、これを使用しないでください。

... new UIPropertyMetadata(new UIElementCollection())

これは、意図せずにシングルトン コレクションを作成してしまうため、悪い習慣と見なされます。詳細については、コレクション タイプの依存関係プロパティを参照してください。

于 2012-06-14T15:26:38.377 に答える
1

これは、目的の方法でコンテンツを直接追加できるサンプルコントロールです。

ここで重要な行は、MyCustomControlクラスの上部にある属性です。これは、直接追加されたコンテンツを配置する必要があるプロパティをXAMLエディターに指示します。

XAMLコードでは、重要な行はItemsプロパティにバインドされているItemsControlであり、これは実際に各アイテムを表示します。

C#

[ContentProperty("Items")]
public class MyCustomControl : Control
{
    public ObservableCollection<Object> Items
    {
        get { return (ObservableCollection<Object>)GetValue(ItemsProperty); }
        set { SetValue(ItemsProperty, value); }
    }

    public static readonly DependencyProperty ItemsProperty =
        DependencyProperty.Register("Items", typeof(ObservableCollection<Object>), typeof(MyCustomControl), new UIPropertyMetadata(new ObservableCollection<object>()));        
}

XAML

<Style TargetType="{x:Type local:MyCustomControl}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type local:MyCustomControl}">
                <ItemsControl ItemsSource="{TemplateBinding Items}"  />
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

<local:MyCustomControl>
    <Button />
    <Button />
</local:MyCustomControl>
于 2012-06-14T15:29:28.870 に答える