Как я могу объединить XAML и шаблон в один шаблон C # с помощью Rg.Плагины.Всплывающее окно?

#c# #xaml #xamarin #xamarin.forms #contentproperty

#c# #xaml #xamarin #xamarin.forms #contentproperty

Вопрос:

Я хотел бы упростить добавление всплывающих окон диалоговых окон в свой код до необходимого минимума.

В настоящее время у меня есть этот код:

 <pages:PopupPage
    x:Class="Test.Popup"
    xmlns="http://xamarin.com/schemas/2014/forms"
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
    xmlns:pages="clr-namespace:Rg.Plugins.Popup.Pages;assembly=Rg.Plugins.Popup">
    <ContentView HorizontalOptions="FillAndExpand" VerticalOptions="FillAndExpand">
        <t:PopupFrame>
           <Label Text="ABC" />
           <Label Text="ABC" />
        </t:PopupFrame>
    </ContentView>
</pages:PopupPage>
 
 public partial class Popup : Rg.Plugins.Popup.Pages.PopupPage
{
    public Popup()
    {
        InitializeComponent();
    }
}
 

И у меня PopupFrame здесь:

 [Xamarin.Forms.ContentProperty("Contents")]
public class PopupFrame : Frame
{
    StackLayout contentStack { get; } = new StackLayout()
    {
        Spacing = 0,
        Padding = new Thickness(0),
        Orientation = StackOrientation.Vertical
    };
    public IList<View> Contents { get => contentStack.Children; }

    public PopupFrame()
    {
        Content = contentStack;
        HasShadow = true;
        HorizontalOptions = LayoutOptions.FillAndExpand;
        Padding = 0;
        SetDynamicResource(BackgroundColorProperty, "PopUpBackgroundColor");
        SetDynamicResource(CornerRadiusProperty, "PopupCornerRadius");
        VerticalOptions = LayoutOptions.Center;   
    }
}
 

Может кто-нибудь предложить способ, которым я могу объединить эти два, чтобы требовалось только следующее:

 <t:PopupPage
    x:Class="Test.Popup"
    xmlns="http://xamarin.com/schemas/2014/forms"
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
    xmlns:t="clr-namespace:Test.Templates">
    <Label Text="ABC" />
    <Label Text="ABC" />
</pages:PopupPage>
 

Итак, я ищу контент для этого:

 [Xamarin.Forms.ContentProperty("Contents")]
public class Popup : Rg.Plugins.Popup.Pages.PopupPage 
{
}
 

Обновление: вот что я попробовал на основе предложенного ответа:

 <?xml version="1.0" encoding="UTF-8" ?>
<pages:PopupPage
    x:Class="Memorise.DecksTab.CopyDeckPopup"
    xmlns="http://xamarin.com/schemas/2014/forms"
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
    xmlns:pages="clr-namespace:Rg.Plugins.Popup.Pages;assembly=Rg.Plugins.Popup">
    <Label Text="ABC" />
    <Label Text="ABC" />
</pages:PopupPage>
 

С помощью резервного кода:

 [Xamarin.Forms.ContentProperty("Contents")]
[XamlCompilation(XamlCompilationOptions.Compile)]
public partial class CopyDeckPopup : Rg.Plugins.Popup.Pages.PopupPage
{

    PopupFrame contentFrame { get; } = new PopupFrame();

    public IList<View> Contents { get => contentFrame.Contents; }

    public CopyDeckPopup(string clickedDeckName, string clickedDeckDescription)
    {
        BindingContext = new CopyDeckPopupViewModel(clickedDeckName, clickedDeckDescription);
        InitializeComponent();
        Content = new ContentView()
        {
            HorizontalOptions = LayoutOptions.FillAndExpand,
            VerticalOptions = LayoutOptions.FillAndExpand,
            Content = contentFrame
        };
    }

}
 

Это выдает мне эту ошибку, НО отображение правильное, и я вижу две азбуки.

введите описание изображения здесь

Ответ №1:

Из этого фрагмента кода:

 <pages:PopupPage
    x:Class="Test.Popup"
    xmlns="http://xamarin.com/schemas/2014/forms"
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
    xmlns:pages="clr-namespace:Rg.Plugins.Popup.Pages;assembly=Rg.Plugins.Popup">
    <ContentView HorizontalOptions="FillAndExpand" VerticalOptions="FillAndExpand">
        <t:PopupFrame>
           <Label Text="ABC" />
           <Label Text="ABC" />
        </t:PopupFrame>
    </ContentView>
</pages:PopupPage>
 

видно, что ContentProperty of PopupPage — это одно представление (которое ContentView в приведенном выше коде занято a).

Но если вы хотите иметь возможность писать код, подобный

 <t:PopupPage
    x:Class="Test.Popup"
    xmlns="http://xamarin.com/schemas/2014/forms"
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
    xmlns:t="clr-namespace:Test.Templates">
   <Label Text="ABC" />
   <Label Text="ABC" />
</pages:PopupPage>
 

затем вы хотите PopupPage ContentProperty , чтобы он был таким, чтобы он мог принимать список элементов (например, до двух Label s в приведенном выше коде), и, кроме того, для этих элементов установлено значение your PopupFrame , которое должно быть помещено внутри a ContentView

Все, что вам нужно сделать, это изменить PopupPage (который, как я предполагаю, наследуется от ContentPage [?]), чтобы принимать в качестве содержимого несколько элементов, следующим образом

 [Xamarin.Forms.ContentProperty("Contents")]
[XamlCompilation(XamlCompilationOptions.Compile)]
public partial class PopupPage : ContentPage
{

    PopupFrame contentFrame { get; } = new PopupFrame();

    public IList<View> Contents { get => contentFrame.Contents; }

    public PopupPage()
    {
        InitializeComponent();
        Content = new ContentView()
        {
            HorizontalOptions = LayoutOptions.FillAndExpand,
            VerticalOptions = LayoutOptions.FillAndExpand,
            Content = contentFrame
        };
    }
}
 

Сделав это, теперь вы сможете написать код, который хотите

 <?xml version="1.0" encoding="utf-8" ?>
<t:PopupPage xmlns="http://xamarin.com/schemas/2014/forms"
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
    xmlns:t="clr-namespace:popupframe"
    x:Class="popupframe.MainPage">
    <Label Text="Label1"/>
    <Label Text="Label2"/>
</t:PopupPage>