我有一个包含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的腔体上?
答案 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()
方法。