1

2行を含むユーザーコントロールがあります。1 行目にはラベルがあり、2 行目にはキャンバスを含むスクロールビューアーがあります。

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto"/>
        <RowDefinition />
    </Grid.RowDefinitions>
    <Label Grid.Row="0" Content="TITLE" HorizontalAlignment="Stretch" HorizontalContentAlignment="Center" Name="label1" VerticalAlignment="Top" FontSize="26" />
    <ScrollViewer Grid.Row="1" VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Disabled">
        <Canvas Background="White" />
    </ScrollViewer>
</Grid>

メインの window.xaml で、このユーザー コントロールを追加してから、そのキャンバスに項目を追加しようとしています。

<local:UserCanvas>
    <label Content="Test" />
</local:UserCancas>

ここに問題があるのは、そこにそのラベルがあると、ユーザー コントロールの行 1 の "TITLE" ラベルが上書きされることです。UserControl の大静脈に配置されるように追加するにはどうすればよいですか?

4

2 に答える 2

2

で を定義する代わりに、 を定義ContentしますUserControlUserControl.ContentTemplate

たとえば、書く代わりに

<UserControl ...>
    <Grid>
        ...
        <Canvas />
        ...
    </Grid>
</UserControl>

使用する

<UserControl ...>
    <UserControl.ContentTemplate>
        <DataTemplate>
            <Grid>
                ...
                <Canvas>
                    <ContentPresenter Content="{TemplateBinding Content}"/>
                </Canvas>
                ...
            </Grid>
        </DataTemplate>
    </UserControl.ContentTemplate>
</UserControl>

最初の構文を使用する場合、UserControl を使用するときにコンテンツを指定すると、既存のコンテンツが上書きされるため、レンダリングされたビジュアル ツリーは次のようになります。

<local:UserCanvas>
    <label Content="Test" />
</local:UserCancas>

2 番目の構文を使用することで、コンテンツを ContentTemplate にラップしているため、レンダリングされたビジュアル ツリーは最終的に次のようになります。

<local:UserCanvas>
    <Grid>
        ...
        <Canvas>
             <label Content="Test" />
        </Canvas>
        ...
    </Grid>
</local:UserCanvas>
于 2013-02-27T19:49:07.877 に答える
0

Page_Load()メインプログラムからアクセスできるユーザーコントロールに、パブリックプロパティ(ユーザーコントロールでチェックして応答する)および/またはパブリックメソッド(コントロールの外部から呼び出すだけ)を追加してみます。どちらの方法を取るかは、実行する必要があるアクションがどれほど複雑になるかによって少し異なります。Page_Load()これは、パブリック プロパティ +メソッドを介して処理するのに十分単純であるように見えます。

于 2013-02-27T18:55:32.717 に答える