다음을 통해 공유


에서 런타임에 XAML 로드 Xamarin.Forms

네임스페이스에는 Xamarin.Forms.Xaml 런타임에 XAML을 로드하고 구문 분석하는 데 사용할 수 있는 두 가지 LoadFromXaml 확장 메서드가 포함되어 있습니다.

배경

XAML 클래스가 Xamarin.Forms 생성되면 메서드가 LoadFromXaml 간접적으로 호출됩니다. 이는 XAML 클래스의 코드 숨김 파일이 생성자에서 메서드를 호출하기 InitializeComponent 때문에 발생합니다.

public partial class MainPage : ContentPage
{
    public MainPage()
    {
        InitializeComponent();
    }
}

Visual Studio에서 XAML 파일이 포함된 프로젝트를 빌드할 때 XAML 파일을 구문 분석하여 메서드의 InitializeComponent 정의가 포함된 C# 코드 파일(예: MainPage.xaml.g.cs)을 생성합니다.

private void InitializeComponent()
{
    global::Xamarin.Forms.Xaml.Extensions.LoadFromXaml(this, typeof(MainPage));
    ...
}

이 메서드는 InitializeComponent 메서드를 LoadFromXaml 호출하여 .NET Standard 라이브러리에서 XAML 파일(또는 컴파일된 이진 파일)을 추출합니다. 추출 후 XAML 파일에 정의된 모든 개체를 초기화하고, 부모-자식 관계에서 모두 연결하고, 코드에 정의된 이벤트 처리기를 XAML 파일에 설정된 이벤트에 연결하고, 결과 개체 트리를 페이지의 콘텐츠로 설정합니다.

런타임에 XAML 로드

메서드는 LoadFromXaml public애플리케이션에서 Xamarin.Forms 호출되어 런타임에 XAML을 로드하고 구문 분석할 수 있습니다. 이렇게 하면 애플리케이션이 웹 서비스에서 XAML을 다운로드하고, XAML에서 필요한 보기를 만들고, 애플리케이션에 표시하는 등의 시나리오가 허용됩니다.

Warning

런타임에 XAML을 로드하면 상당한 성능 비용이 들며 일반적으로 피해야 합니다.

다음 코드 예제에서는 간단한 사용을 보여 줍니다.

using Xamarin.Forms.Xaml;
...

string navigationButtonXAML = "<Button Text=\"Navigate\" />";
Button navigationButton = new Button().LoadFromXaml(navigationButtonXAML);
...
_stackLayout.Children.Add(navigationButton);

이 예제 Button 에서는 해당 속성 값이 에 정의된 XAML에서 설정되는 인스턴스를 string만듭니다Text. Button 그런 다음 페이지의 XAML에 정의된 값에 추가 StackLayout 됩니다.

참고 항목

확장 메서드를 LoadFromXaml 사용하면 제네릭 형식 인수를 지정할 수 있습니다. 그러나 형식 인수는 작동하는 인스턴스의 형식에서 유추되므로 형식 인수를 지정할 필요가 거의 없습니다.

이 메서드를 LoadFromXaml 사용하여 XAML을 확장할 수 있습니다. 다음 예제에서는 부풀린 ContentPage 다음 탐색합니다.

using Xamarin.Forms.Xaml;
...

// See the sample for the full XAML string
string pageXAML = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<ContentPage xmlns=\"http://xamarin.com/schemas/2014/forms\"\nxmlns:x=\"http://schemas.microsoft.com/winfx/2009/xaml\"\nx:Class=\"LoadRuntimeXAML.CatalogItemsPage\"\nTitle=\"Catalog Items\">\n</ContentPage>";

ContentPage page = new ContentPage().LoadFromXaml(pageXAML);
await Navigation.PushAsync(page);

요소 액세스

런타임에 메서드를 LoadFromXaml 사용하여 XAML을 로드해도 런타임 개체 이름을 지정한 XAML 요소에 대한 강력한 형식의 액세스를 허용하지 않습니다(사용 x:Name). 그러나 이러한 XAML 요소는 메서드를 FindByName 사용하여 검색한 다음 필요에 따라 액세스할 수 있습니다.

// See the sample for the full XAML string
string pageXAML = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<ContentPage xmlns=\"http://xamarin.com/schemas/2014/forms\"\nxmlns:x=\"http://schemas.microsoft.com/winfx/2009/xaml\"\nx:Class=\"LoadRuntimeXAML.CatalogItemsPage\"\nTitle=\"Catalog Items\">\n<StackLayout>\n<Label x:Name=\"monkeyName\"\n />\n</StackLayout>\n</ContentPage>";
ContentPage page = new ContentPage().LoadFromXaml(pageXAML);

Label monkeyLabel = page.FindByName<Label>("monkeyName");
monkeyLabel.Text = "Seated Monkey";
...

이 예제에서는 a ContentPage 에 대한 XAML이 확장됩니다. 이 XAML에는 속성이 설정되기 전에 Text 메서드를 FindByName 사용하여 검색되는 명명monkeyName된 이름이 포함 Label 됩니다.