如何将项添加到作为UserControl一部分的Canvas中

本文关键字:一部分 UserControl Canvas 添加 | 更新日期: 2023-09-27 18:01:30

我有一个包含2行的usercontrol。第一行有一个标签,第二行有一个带画布的滚动查看器:

<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>

在主窗口中。xaml我正在尝试添加这个用户控件,然后添加项目到它的画布。

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

这里的问题是当我在那里有那个标签时它只是覆盖了用户控件第一行的"TITLE"标签。我如何添加的东西,使他们被放置在cavas的UserControl?

如何将项添加到作为UserControl一部分的Canvas中

与其在UserControl中定义Content,不如定义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将导致现有的内容被覆盖,因此您呈现的可视化树最终看起来像这样:

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

通过使用第二种语法,你将内容包装在ContentTemplate中,因此呈现的可视化树最终看起来像这样:

<local:UserCanvas>
    <Grid>
        ...
        <Canvas>
             <label Content="Test" />
        </Canvas>
        ...
    </Grid>
</local:UserCanvas>

我会尝试添加一个公共属性(您在用户控件的Page_Load()中检查和响应)和/或公共方法(您只是从控件外部调用)到用户控件,然后您可以从主程序访问。走哪条路取决于你需要采取的行动有多复杂。在我看来,这将是足够简单的,通过公共属性+ Page_Load()方法来处理。