You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:03:47