ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

WPF, Template.FindName()方法返回空,而实际上有子控件

2021-06-14 09:33:03  阅读:243  来源: 互联网

标签:控件 gridContainer 有子 frameworkElement Add Grid Template new grid


问题场景:

笔者自定义了一个GridContainer控件,并给GridContainer定义了一个Items依赖属性,把要放到gridContainer里显示的内容传递过去。当GridContainer所在的UserControl通过Xaml创建时一切都正常,但是当UserControl在通过代码创建时,发现总是找不到style里的Grid元素。后来查找资料才知道,这个时候是因为强制使用ApplyTemplate()方法。

//用于传递内容的依赖属性
public static readonly DependencyProperty ItemsProperty = DependencyProperty.Register(nameof(Items), typeof(IEnumerable<GridElement>), typeof(GridContainer), new PropertyMetadata(default(IEnumerable<GridElement>), new PropertyChangedCallback(CallMeWhenItemsFilled)));
//grid container style
<Style TargetType="{x:Type customControls:GridContainer}"> <Setter Property="Template"> <Setter.Value> <ControlTemplate> <Grid x:Name="Container" /> </ControlTemplate> </Setter.Value> </Setter> </Style>
private static void CallMeWhenItemsFilled(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
            var items = e.NewValue as IEnumerable<GridElement>;
            var gridElements = (items ?? Array.Empty<GridElement>()).ToList();
            if (d is GridContainer gridContainer)
            {
//代码会卡在这里,总是找不到"container"元素
//gridContainer.GetTemplateChild("Container") 总是返回空值
//但是在gridContainer.Template通过Visual Studio调试的时候可以看到ChildNames里有这个元素


gridContainer.ApplyTemplate(); //这句是关键,加上这个后就可以再次找到"Container"元素
if (gridContainer.GetTemplateChild("Container") is Grid grid)
                {
                    grid.ColumnDefinitions.Add(new ColumnDefinition {Width = GridLength.Auto});
                    grid.ColumnDefinitions.Add(new ColumnDefinition
                    {
                        Width = new GridLength(1,GridUnitType.Star)
                    });
                    var counter = 0;
                    foreach (var frameworkElement in gridElements.Select(ResolveGridElementControls))
                    {
                        grid.RowDefinitions.Add(new RowDefinition
                        {
                            Height = GridLength.Auto,
                        });
                        frameworkElement.Item1.SetValue(Grid.RowProperty, counter);
                        frameworkElement.Item1.SetValue(Grid.ColumnProperty, 0);
                        frameworkElement.Item2.SetValue(Grid.RowProperty, counter);
                        frameworkElement.Item2.SetValue(Grid.ColumnProperty, 1);

                        grid.Children.Add(frameworkElement.Item1);
                        grid.Children.Add(frameworkElement.Item2);
                        counter++;
                    }
                }
}

 

标签:控件,gridContainer,有子,frameworkElement,Add,Grid,Template,new,grid
来源: https://www.cnblogs.com/baibaisheng/p/14881847.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有