10

私はWPFを初めて使用し、ネストされたコンテンツを持つUserControlを作成しようとしています。

<my:InformationBox Header="General Information" Width="280">
    <StackPanel>
        <Label>Label1</Label>
        <Label>Label2</Label>
    </StackPanel>
</my:InformationBox>

ご覧のとおり、StackPanelを配置したいと思います。いくつかの記事を読んでいるときに、ContentPresenterをUserControlに追加することになっているので、追加しましたが、Contentプロパティにバインドする必要があるものが見つかりません。

これが私のUserControlコードです

<UserControl x:Class="ITMAN.InformationBox"
             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" 
             mc:Ignorable="d" 
             d:DesignHeight="200" d:DesignWidth="280" Name="infoBox" Loaded="infoBox_Loaded">
    <StackPanel Width="{Binding ElementName=infoBox, Path=Width}" HorizontalAlignment="Stretch">
        <Label Content="{Binding ElementName=infoBox, Path=Header}" />
        <Border BorderThickness="0,1,0,0" Padding="10 5" Margin="5 0 5 10" BorderBrush="#B4CEDE">
            <StackPanel>
                <ContentPresenter Content="{Binding Content}" />
                <Label Content="End" />
            </StackPanel>
        </Border>
    </StackPanel>
</UserControl>

さまざまな記事から多くの組み合わせを試しましたが、達成したいことの実例が見つかりません。

同様の質問が以前に別のユーザーによって尋ねられましたが、そこに答えがあったとしても私は役に立ちませんでした。単一のContentPresenterを使用したUserControlの簡単な例はありますか?

4

3 に答える 3

10

ContentPresenter一種の魔法のコントロールです。何も指定しない場合、自動的にContentContentTemplateおよびContentTemplateSelectorプロパティと aTemplateBindingが TemplatedParent に設定されます。つまり、何も提供する必要はありません。

<ContentPresenter/>

UserControl で、UserControl にある対応するプロパティを自動的に使用する必要があります。また、バインディングは{Binding Content}常に DataContext を参照することを覚えておいてください。これは、あなたが望んでいたものではないと思います。

于 2012-07-19T10:06:33.777 に答える
10

にカスタム スタイルを適用することで、この問題を解決しましたGroupBox。で Syle を作成しました。ResourceDictionary次のようになります。

<Style x:Key="InformationBoxStyle" TargetType="GroupBox">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="GroupBox">
                <Grid>
                    <Grid.RowDefinitions>
                        <RowDefinition Height="Auto"/>
                        <RowDefinition Height="*"/>
                    </Grid.RowDefinitions>
                    <Label>
                        <ContentPresenter Margin="4" ContentSource="Header"
                               RecognizesAccessKey="True" />
                    </Label>
                    <Border Grid.Row="1" BorderThickness="0,1,0,0" Padding="10 5"
                               Margin="5 0 5 10" BorderBrush="#B4CEDE">
                        <StackPanel>
                            <ContentPresenter />
                        </StackPanel>
                    </Border>
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

そして、このスタイルをGroupBox

<GroupBox Header="General Information" Width="280" Style="{StaticResource InformationBoxStyle}">
    <StackPanel>
        <Label>Label1</Label>
        <Label>Label2</Label>
    </StackPanel>
</GroupBox>

このコードは期待どおりに機能します

また、それを達成するためのさまざまなオプションを示すこの素晴らしい記事を参照することもでき ますContentPresenter私のコードで動作しない理由を説明します。

于 2012-07-20T08:25:26.130 に答える
2

InnerContent などの UserControl コード ビハインドに依存関係プロパティを作成する必要があります。

    public object InnerContent
    {
        get { return GetValue(InnerContentProperty); }
        set { SetValue(InnerContentProperty, value); }
    }

    public static readonly DependencyProperty InnerContentProperty =
        DependencyProperty.Register("InnerContent", typeof(object), typeof(ConfirmationControl), new PropertyMetadata(null));

次に、その UserControl の XAML 側でその InnerContent にバインドする必要があります。

 <ContentControl Content="{Binding InnerContent, ElementName=userControl}" />

次に、コンテンツを UserControl に直接配置して既存のコンテンツを上書きする代わりに使用する場合は、それを InnerContent 部分に追加するだけです。

    <UserControls:InformationBox>
        <UserControls:InformationBox.InnerContent>
            <TextBlock Text="I'm in the InnerContent" />
        </UserControls:InformationBox.InnerContent>
    </UserControls:InformationBox>

それ以外の場合は、テンプレートまたはスタイルを使用することも同様に優れていますが、スタイルまたはテンプレートを参照することを強制せずに使用するために UserControl をパッケージ化したい場合は、おそらくこれがより良いオプションの 1 つです。

于 2017-06-19T18:48:54.053 に答える