如何将项目添加到属于UserControl的Canvas?

时间:2013-02-27 18:14:34

标签: c# wpf canvas

我有一个包含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>

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

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

这里的问题是,当我在那里有标签时,它会覆盖用户控件第1行中的“TITLE”标签。如何添加东西以便将它们放在UserControl的腔体上?

2 个答案:

答案 0 :(得分: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时指定内容将导致现有内容被覆盖,因此您呈现的Visual Tree最终看起来像这样:

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

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

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

答案 1 :(得分:0)

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

相关问题