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在你的定义中UserControl,定义UserControl.ContentTemplate

例如,而不是写

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

采用

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

如果您使用第一种语法,那么在使用 UserControl 时指定 Content 将导致现有 Content 被覆盖,因此您呈现的 Visual Tree 最终看起来像这样:

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

通过使用第二种语法,您将内容包装在 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 回答