我做了一个自定义控件,这是XAML:
<Style TargetType="{x:Type local:Sheet}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type local:Sheet}">
<Grid Grid.IsSharedSizeScope="True">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="71"></ColumnDefinition>
<ColumnDefinition Width="auto"></ColumnDefinition>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="18"></RowDefinition>
<RowDefinition Height="auto"></RowDefinition>
</Grid.RowDefinitions>
<Border Background="{TemplateBinding Background}" Grid.Column="1" Grid.Row="1"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}" VerticalAlignment="{TemplateBinding VerticalAlignment}" HorizontalAlignment="{TemplateBinding HorizontalAlignment}">
<Grid x:Name="G">
<Border Background="#59217346"></Border>
</Grid>
</Border>
<Button Background="#e6e6e6" BorderBrush="#999999" BorderThickness="0,0,1,1" Visibility="Collapsed">◢</Button>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
我需要访问x:Name="G"
的网格以添加和删除其子级。
我找到了一个与此相关的主题:Access children of Custom Control wpf c#
它建议使用Dependency Property
。但是,我还不能绑定Children
的{{1}}。
还有一种解决方案,可以使用Grid
直接获取VisualTreeHelper
。
同时,Grid
仅在控件完全加载时才能获得子项,或者它仅返回0个子项。
我需要在创建它的时候初始化它的孩子,并且几乎不等待控件加载。例如,每当我将自定义控件的VisualTreeHelper
行设置为4时,Dependency Property
的{{1}}就会将其Grid
添加和删除为4。
我该如何解决?请帮助我。
答案 0 :(得分:1)
在CustomControl
覆盖OnApplyTemplate
内部,并使用FrameworkElement.GetTemplateChild(String)
获取作为模板一部分的命名元素。 OnApplyTemplate
是在创建控件可视树(应用模板)并对其进行度量时但在Loaded
事件之前调用的。
public override void OnApplyTemplate()
{
var grid = GetTemplateChild("G") as Grid;
grid.RowDefinitions.Add(new RowDefinition());
}
答案 1 :(得分:0)
使用var g = (Grid)Control.Template.FindName("G",Control)
,此处“控件”是您将样式设置为的控件的名称。它可以是this
。将返回的内容转换为“ G”的类型。这里(网格)。然后通过saying g.Children[index]
访问所有子项,您可以访问其属性,例如g.Row
g.RowDefinations
;