如何从 Xamarin Forms 中另一个页面的 XAML 访问自定义视图的字段或控件?
How to access fields or controls of Custom View from another Page's XAML in Xamarin Forms?
我有一个自定义控件,我想从要使用它的页面中添加一些元素。
就这样
<Label>
<Label.Text>First Name</Label.Text>
</Label>
这里,Label
是预定义的,Label
的Text 属性是在其他Page中添加的,即。在使用它的地方,我想添加控件,其值将从将使用它的另一个页面分配。
这是我在 XAML (DialogView.xaml)
中的自定义控件
<?xml version="1.0" encoding="UTF-8"?>
<ContentView ...>
<ContentView.Content>
<Frame x:Name="dialogContainer" Padding="0" BackgroundColor="Transparent">
<!--I want to use this StackLayout below and add controls inside it from other Page's XAML-->
<StackLayout x:Name="ChildStackLayout" x:FieldModifier="public" />
</Frame>
</ContentView.Content>
</ContentView>
下面是我的使用方法(MainPage.xaml)
<controls:DialogView>
<controls:DialogView.ChildStackLayout>
<!--Here I want to add controls in my Custom Control-->
<Label Text="Hello, this is a custom dialog" />
</controls:DialogView.ChildStackLayout>
</controls:DialogView>
但是ChildStackLayout
在其他页面无法访问
您不能通过名称 属性 直接将新控件添加到 xaml 中自定义控件的子布局控件中。
首先,您可以在page.cs中添加新控件。如:
//declare the content view in the xaml
<control:CustomView x:Name="customview">
//add children control
customview.ChildStackLayout.Children.Add(new Label() { Text = "hello"});
在自定义控件的代码后面添加一个 public 属性,如您的情况那样说 DialogContent
(而不是 ChildStackLayout
)。现在添加一个 BindableProperty
来绑定它。然后用其属性改.
在自定义控件的 C# 代码后面:
public partial class DialogView : Dialog // Dialog inherits ContentView
{
public Layout DialogContent { get => (Layout)GetValue(DialogContentProperty); set => SetValue(DialogContentProperty, value); }
public static readonly BindableProperty DialogContentProperty = BindableProperty.Create(nameof(DialogContent), typeof(Layout), typeof(DialogView), propertyChanged: DialogContentPropertyChanged);
public static void DialogContentPropertyChanged(BindableObject bindable, object oldValue, object newValue)
{
var control = (DialogView)bindable;
control.dialog.Content = newValue as Layout;
}
}
DialogContent
是 Layout
类型,因为通常一个对话框会包含多个元素,因此您可以使用任何布局,例如 StackLayout
或其他布局。并且所有布局都继承自 Layout
,因此,您可以为对话框的内容使用任何布局。
现在,当您想要使用此自定义控件时,您可以将其内容嵌套在 xaml 的父级中,就像您想要的那样。
<controls:DialogView>
<controls:DialogView.DialogContent>
<StackLayout Padding="10" Spacing="10">
<Label Text="Hello, this is a custom dialog" />
<Button Text="OK" />
</StackLayout>
</controls:DialogView.DialogContent>
</controls:DialogView>
我有一个自定义控件,我想从要使用它的页面中添加一些元素。
就这样
<Label>
<Label.Text>First Name</Label.Text>
</Label>
这里,Label
是预定义的,Label
的Text 属性是在其他Page中添加的,即。在使用它的地方,我想添加控件,其值将从将使用它的另一个页面分配。
这是我在 XAML (DialogView.xaml)
中的自定义控件<?xml version="1.0" encoding="UTF-8"?>
<ContentView ...>
<ContentView.Content>
<Frame x:Name="dialogContainer" Padding="0" BackgroundColor="Transparent">
<!--I want to use this StackLayout below and add controls inside it from other Page's XAML-->
<StackLayout x:Name="ChildStackLayout" x:FieldModifier="public" />
</Frame>
</ContentView.Content>
</ContentView>
下面是我的使用方法(MainPage.xaml)
<controls:DialogView>
<controls:DialogView.ChildStackLayout>
<!--Here I want to add controls in my Custom Control-->
<Label Text="Hello, this is a custom dialog" />
</controls:DialogView.ChildStackLayout>
</controls:DialogView>
但是ChildStackLayout
在其他页面无法访问
您不能通过名称 属性 直接将新控件添加到 xaml 中自定义控件的子布局控件中。
首先,您可以在page.cs中添加新控件。如:
//declare the content view in the xaml
<control:CustomView x:Name="customview">
//add children control
customview.ChildStackLayout.Children.Add(new Label() { Text = "hello"});
在自定义控件的代码后面添加一个 public 属性,如您的情况那样说 DialogContent
(而不是 ChildStackLayout
)。现在添加一个 BindableProperty
来绑定它。然后用其属性改.
在自定义控件的 C# 代码后面:
public partial class DialogView : Dialog // Dialog inherits ContentView
{
public Layout DialogContent { get => (Layout)GetValue(DialogContentProperty); set => SetValue(DialogContentProperty, value); }
public static readonly BindableProperty DialogContentProperty = BindableProperty.Create(nameof(DialogContent), typeof(Layout), typeof(DialogView), propertyChanged: DialogContentPropertyChanged);
public static void DialogContentPropertyChanged(BindableObject bindable, object oldValue, object newValue)
{
var control = (DialogView)bindable;
control.dialog.Content = newValue as Layout;
}
}
DialogContent
是 Layout
类型,因为通常一个对话框会包含多个元素,因此您可以使用任何布局,例如 StackLayout
或其他布局。并且所有布局都继承自 Layout
,因此,您可以为对话框的内容使用任何布局。
现在,当您想要使用此自定义控件时,您可以将其内容嵌套在 xaml 的父级中,就像您想要的那样。
<controls:DialogView>
<controls:DialogView.DialogContent>
<StackLayout Padding="10" Spacing="10">
<Label Text="Hello, this is a custom dialog" />
<Button Text="OK" />
</StackLayout>
</controls:DialogView.DialogContent>
</controls:DialogView>