如何从 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;
    }
}

DialogContentLayout 类型,因为通常一个对话框会包含多个元素,因此您可以使用任何布局,例如 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>