我想在我使用的每个页面上包含一个ActivityIndicator
的视图。因此,我创建了一个自定义控件以及绝对/相对布局,如果您想要全屏显示,这是必需的。其他解决方案在每页上嵌入ActivitIndicator
。我正在寻找可以自动执行此操作的解决方案"。
子类化将是一个选项,但我想尽可能多地使用XAML,我目前的解决方案无法提供(并且结构模糊不清)。
现在我找到ControlTemplate
并将自定义视图/控件放在那里。但我发现我无法从ContentPage
访问自定义控件。有TemplateBinding,您可以在其中访问公共属性。例如。您可以更改标签的文本值。但我的情况有点复杂,我需要从文件/模型后面的代码访问控件。然后我可以致电show()
或hide()
。
在How to access the elements of a ControlTemplate in Xamarin Forms中有人建议使用命令,但这似乎仅适用于少数控件(例如按钮),而不适用于我的自定义控件。
我该怎么办?我可以做this.ControlTemplate.GetControl(controlName)
之类的事情吗?
答案 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>
。