从当前ContentPage中的ControlTemplate访问自定义控件

时间:2016-09-01 08:52:59

标签: xaml xamarin xamarin.forms

我想在我使用的每个页面上包含一个ActivityIndicator的视图。因此,我创建了一个自定义控件以及绝对/相对布局,如果您想要全屏显示,这是必需的。其他解决方案在每页上嵌入ActivitIndicator。我正在寻找可以自动执行此操作的解决方案"。

子类化将是一个选项,但我想尽可能多地使用XAML,我目前的解决方案无法提供(并且结构模糊不清)。

现在我找到ControlTemplate并将自定义视图/控件放在那里。但我发现我无法从ContentPage访问自定义控件。有TemplateBinding,您可以在其中访问公共属性。例如。您可以更改标签的文本值。但我的情况有点复杂,我需要从文件/模型后面的代码访问控件。然后我可以致电show()hide()

How to access the elements of a ControlTemplate in Xamarin Forms中有人建议使用命令,但这似乎仅适用于少数控件(例如按钮),而不适用于我的自定义控件。

我该怎么办?我可以做this.ControlTemplate.GetControl(controlName)之类的事情吗?

2 个答案:

答案 0 :(得分:1)

回到我的定制控制建议:

public partial class CustomActivityIndicator : Grid
{
    public static readonly BindableProperty IsBusyProperty =
        BindableProperty.Create(nameof(IsBusy),
                                typeof(bool),
                                typeof(CustomActivityIndicator),
                                default(bool));

    public bool IsBusy
    {
        get { return (bool)GetValue(IsBusyProperty); }
        set { SetValue(IsBusyProperty, value); }
    }

    public CustomActivityIndicator()
    {
        InitializeComponent();
    }
}

XAML:

<Grid x:Name="control"
      xmlns="http://xamarin.com/schemas/2014/forms"
      xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
      x:Class="SuperForms.Samples.CustomActivityIndicator">
    <ActivityIndicator IsRunning="{Binding IsBusy, Source={x:Reference control}}"/>
</Grid>

使用方法:

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:local="clr-namespace:SuperForms.Samples;assembly=SuperForms.Samples"
             x:Class="SuperForms.Samples.PageWithCustomActivityIndicator">
    <local:CustomActivityIndicator IsBusy="true"/>
</ContentPage>

答案 1 :(得分:0)

我知道为什么......

例如,您的自定义控件是

public class LibraryGridView : View
{
    public LibraryGridView()
    {

    }
}

然后你必须使用:

LibraryGridView hebrewFlowLayout = (LibraryGridView)XFVisualTreeHelper.FindTemplateElementByName<View>(this, "MyLayoutElement");

注意投射LibraryGridView<View>