【问题标题】:How to fix "The property Content is set more than once" error in XAML when overriding the ContentProperty of ContentPage覆盖 ContentPage 的 ContentProperty 时如何修复 XAML 中的“属性内容设置不止一次”错误
【发布时间】:2020-11-25 08:33:13
【问题描述】:

这是我的代码:

<?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 说时遇到错误

属性“内容”设置了多次

【问题讨论】:

    标签: c# xaml xamarin xamarin.forms contentproperty


    【解决方案1】:

    我可以重现该行为。

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

    似乎 VS 无法识别 ContentProperty 正在被覆盖,而是假设您正在尝试将两个 Labels 添加到 @987654324 @,这是错误的,因为您要将它们添加到您的自定义 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's 是一个属性,

    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;
         
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-15
      • 2013-05-04
      • 1970-01-01
      相关资源
      最近更新 更多