#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>