当前位置: 首页 > 编程语言 > C#

在ControlTemplate中访问控件分享

时间:2023-04-10 17:06:05 C#

在ControlTemplate中访问控件这是xaml:我想访问一个名为textBlock2的TextBlock。我试图覆盖OnApplyTemplate但得到了null。我试过了:GridgridInTemplate=(Grid)btnWedding.Template.FindName("grid",btnWedding);varct0=btnWedding.Template.FindName("textBlock2",btnWedding);varct1=btnWedding.FindName("textBlock2");varct2=btnWedding.FindResource("textBlock2");gridInTemplate为空(示例取自MSDN)。当然ct#都是空的。我在这里错过了什么?如果您已覆盖OnApplyTemplate,则不要使用FindResource()或Template.FindName()或任何使用VisualTreeHelper的技巧。只需使用this.GetTemplateChild("textBlock2");WPF中的模板具有独立的名称范围。这是因为模板被重复使用,并且随着控件的多个实例各自实例化它们的模板,模板中定义的任何名称都不能保持唯一。调用GetTemplateChild方法以在实例化后从模板返回对对象的引用。您不能使用FrameworkElement.FindName方法从模板中查找项,因为FrameworkElement.FindName在更一般的范围内运行,并且ControlTemplate类本身与应用后的实例化模板之间没有任何联系。检查此链接:http://msdn.microsoft.com/en-us/library/system.windows.frameworkelement.gettemplatechild.aspx如果您的示例是Microsoft示例,那么我建议您再次阅读。你可能跳过了一些东西。http://msdn.microsoft.com/en-us/library/bb613586.aspx总结-在创作自定义控件时使用GetTemplateChild(),例如OnApplyTemplate,在其他情况下使用Template.FindName。您的代码是正确的,但可能不在正确的位置......FindName仅在应用模板后才有效。通常,这在覆盖自定义控件中的OnApplyTemplate时使用。由于您没有创建自定义控件,因此可以在按钮的Loaded事件中执行此操作。请尝试下面的代码。这将返回模板化元素。this.GetTemplateChild("控件名称");您可以使用VisualTreeHelper迭代按钮的可视树以获取任何子项。您可以使用这个基本的通用函数来获取它privatestaticDependencyObjectRecursiveVisualChildFinder(DependencyObjectrootObject){varchild=VisualTreeHelper.GetChild(rootObject,0);如果(孩子==null)返回null;返回child.GetType()==typeof(T)?孩子:递归VisualChildFinder(孩子);您可以像TextBlocktextblock=RecursiveVisualChildFinder(btnWedding);一样使用它if(textblock.Name=="textBlock2"){//在这里做你的事}如果你可以得到web网格控制,那么尝试使用下面的代码TextBlocktextBlock2=(TextBlock)gridInTemplate.Children[1];方法“FrameworkElement.FindName(stringname)”使用布局的名称范围,其中按钮/控件用于解析名称。简而言之,您可以使用它在应用程序布局的网格或堆栈面板中查找子项。但是您不能使用它来查找您在应用程序布局中使用的控件的子项(因为模板化的子项名称在不同的范围内)让您的子项符合您的情况的一种方法是继承按钮。由于您不会修改按钮的任何其他属性或行为,因此新按钮将正常工作。我实际上从来没有使用过这种方法来访问模板化的子项,因为我从来没有在控件类的范围之外使用过它们。以上就是C#学习教程:获取ControlTemplate中控件共享的所有内容。如果对你有用,需要进一步了解C#学习教程,希望你多多关注——")作为文本块;base.OnApplyTemplate();}}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: