如何在Xamarin.Forms中以编程方式引用ControlTemplate内的Grid?
如何在代码中引用ControlTemplate内的Grid控件?
先看你给出的XAML资源定义:
<ContentPage.Resources> <ResourceDictionary> <ControlTemplate x:Key="SlideViewControlTemplate"> <Grid x:Key="GridSlideViewIndicators" Padding="0,0,0,0"> <ContentPresenter /> </Grid> </ControlTemplate> </ResourceDictionary> </ContentPage.Resources>
你之前直接在Resources里查找这个Grid肯定找不到,因为它是嵌套在ControlTemplate内部的,并不是ResourceDictionary的直接子元素。得换个思路来获取,分两种场景:
场景1:获取ControlTemplate模板里的原始Grid(未实例化的模板内容)
如果你只是想拿到模板定义里的Grid对象,可以先获取到ControlTemplate实例,再创建它的内容并转换类型:
// 先从Resources里取出ControlTemplate if (Resources.TryGetValue("SlideViewControlTemplate", out var templateObj) && templateObj is ControlTemplate slideTemplate) { // 创建模板的内容实例,这里就是我们要的Grid var targetGrid = slideTemplate.CreateContent() as Grid; if (targetGrid != null) { // 现在就可以操作这个Grid啦 // 注意:这只是模板的一个"副本",不是实际运行中控件里的那个Grid } }
场景2:获取已应用该模板的控件内的Grid实例(运行中的实际控件)
如果你的某个控件已经应用了这个ControlTemplate(比如某个View的ControlTemplate属性绑定到了SlideViewControlTemplate),那要获取这个控件内部实际渲染的Grid,得用控件的GetTemplateChild方法——此时控件里的Grid是模板实例化后的专属副本:
// 假设myTargetControl是已经应用了该ControlTemplate的控件实例 var targetGrid = myTargetControl.GetTemplateChild("GridSlideViewIndicators") as Grid; if (targetGrid != null) { // 这里拿到的就是运行中实际显示的Grid,可以直接操作它的属性、添加子元素等 }
简单总结下:Resources里只存了ControlTemplate这个顶级资源,里面的Grid是模板的内部内容,不能直接通过Resources查找。要根据你是要模板定义里的Grid,还是实际控件里的Grid,选择上面对应的方法就行~
内容的提问来源于stack exchange,提问作者lepton
相关产品推荐
相关产品推荐

