如何在自定义控件中获取控件?

时间:2019-06-16 11:42:38

标签: wpf

我做了一个自定义控件,这是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。

我该如何解决?请帮助我。

2 个答案:

答案 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;