如何在Xamarin Forms中访问ControlTemplate的元素

时间:2016-08-01 03:24:59

标签: xaml xamarin.forms controltemplate

我在App.xaml中定义了ControlTemplate。现在,我需要能够处理某些UI事件。在Visual Studio的XAML编辑器中,如果我将处理程序附加到事件,则在App.xaml.cs中创建处理程序。但是,我需要在使用此控件模板的页面中执行此操作。

我认为唯一的方法是遍历控件模板中的元素并找到正确的元素并在页面中创建处理程序。但是,我不确定如何从ControlTemplate对象访问元素。

Xamarin是否提供了一种窥视ControlTemplate内容的方法?

3 个答案:

答案 0 :(得分:2)

如果您有 Page 实例,则可以将其强制转换为 IPageController ,并且 InternalChildren 属性包含模板中的控件。

这是我用来按名称查找控件的扩展方法

public static T FindTemplateElementByName<T> (this Page page, string name)
    where T: Element
{
    var pc = page as IPageController;
    if (pc == null)
    {
        return null;
    }

    foreach (var child in pc.InternalChildren)
    {
        var result = child.FindByName<T> (name);
        if (result != null)
        {
            return result;
        }
    }

    return null;
}

答案 1 :(得分:1)

我还没有找到一种方法来迭代控制模板子项。 我用模板绑定 https://developer.xamarin.com/guides/xamarin-forms/templates/control-templates/template-binding/ 要绑定到命令对象,命令的属性在我的基页中定义,然后使用基本视图来定义我的命令并将它们设置为基页OnAppearing覆盖中的绑定支持属性。

我正在撰写博客文章,并在有代码显示时更新。

答案 2 :(得分:0)

尽管这是一个老话题,但是实际的Xamarin Forms API提供了以下内容并且可以直接使用:

contentView.GetTemplateChild("nameOfTheControl")