0

这是我的代码:

<?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 />
    <Label />
</pages:PopupPage>

带支持代码:csharp

[ContentProperty("Contents")]
[XamlCompilation(XamlCompilationOptions.Compile)]
public partial class CopyDeckPopup : Rg.Plugins.Popup.Pages.PopupPage
{
    StackLayout contentStack { get; } = new StackLayout()
    {
        Spacing = 0,
        Padding = new Thickness(0),
        Orientation = StackOrientation.Vertical
    };
     public IList<View> Contents { get => contentStack.Children; }

     public CopyDeckPopup(string clickedDeckName, string clickedDeckDescription)
     {
         BindingContext = new CopyDeckPopupViewModel(clickedDeckName, clickedDeckDescription);
         InitializeComponent();
         Content = contentStack;
     
}

在第一个XAML中,我在第二个Label说中遇到错误

多次设置“内容”属性

4

1 回答 1

1

我可以重现该行为。

尽管如此,在我这边,即使VS显示该警告/​​错误,如果我运行它正确部署的项目并显示两个标签。

似乎VS无法识别sContentProperty覆盖,而是假设您正在尝试将两个Labels 添加到Content,这是错误的,因为您将它们添加到您的自定义中ContentProperty Contents

请运行该项目,如果部署失败,请告诉我...

更新

整个问题在我看来就像 VS 的限制。最后它只是一个警告,你应该可以无视它而没有任何危险。

另一方面,如果您选择在代码上设置标签,您可以编写

public CopyDeckPopup(string clickedDeckName, string clickedDeckDescription)
{
    BindingContext = new CopyDeckPopupViewModel(clickedDeckName, clickedDeckDescription);
    InitializeComponent();
    Content = contentStack;
    Contents.Add(new Label() { Text = "ABC" });
    Contents.Add(new Label() { Text = "DEF" });
}

但是现在这看起来是多余的,因为据我了解ContentProperty的属性是

XAML 处理器用于确定内容属性。

使用 ContentPropertyAttribute 修饰类型允许更短的 XAML 语法。

如果您在C#上编写所有代码,只需使用旧的Stacklayout并编写您的代码

[XamlCompilation(XamlCompilationOptions.Compile)]
public partial class CopyDeckPopup : Rg.Plugins.Popup.Pages.PopupPage
{
    public CopyDeckPopup(string clickedDeckName, string clickedDeckDescription)
    {
        BindingContext = new CopyDeckPopupViewModel(clickedDeckName, clickedDeckDescription);
        InitializeComponent();

        StackLayout contentStack = new StackLayout()
        {
            Spacing = 0,
            Padding = new Thickness(0),
            Orientation = StackOrientation.Vertical,
            Children =
            {
                new Label() { Text = "ABC" },
                new Label() { Text = "ABC" }
            }

        };

        Content = contentStack;
     
}
于 2020-11-25T09:08:27.353 回答