Xamarin UserControl没有在XAML中加载但在

时间:2017-03-17 00:29:13

标签: xaml xamarin user-controls portable-class-library

我试图通过引用dll来使用在解决方案之外定义的usercontrol。如果我使用代码,它可以工作;但不是XAML

这是代码 - 1. UserControl代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Xamarin.Forms;
using Xamarin.Forms.Internals;

namespace ComplexControl
{
    [Preserve]
    public class ComplexControl : ContentView
    {
        public ComplexControl()
        {
            var button = new Button
            {
                Text = "Click Me!",
                //VerticalOptions = LayoutOptions.CenterAndExpand,
                HorizontalOptions = LayoutOptions.FillAndExpand,
            };

            int clicked = 0;
            button.Clicked += (s, e) => button.Text = "Clicked: " + clicked++;

            Content = button;
        }
        [AttributeUsage(AttributeTargets.Class, Inherited = false)]
        class PreserveAttribute : Attribute { }
    }
}
  1. 对于项目中的用法我在PCL中引用程序集ConplexControl
  2. 它适用于代码(即不使用XAML)

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using Xamarin.Forms;
    using ComplexControl;
    
    namespace CustomControlUsageExample
    {
        public partial class MainPage : ContentPage
        {
            public MainPage()
            {
                // without InitializeComponent(); works
                //this way works
                //Step 1.
                StackLayout sl = new StackLayout();
                Label lb = new Label();
                lb.Text = "Hello";
                sl.Children.Add(lb);
                sl.Children.Add(new ComplexControl.ComplexControl());
                Content = sl;
            }
        }
    }
    

    如果我使用XAML则不起作用

    喜欢这个

    XAML

    <?xml version="1.0" encoding="utf-8" ?>
    <ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
                 xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
                 xmlns:local="clr-namespace:CustomControlUsageExample"
                 x:Class="CustomControlUsageExample.MainPage"
                 xmlns:custom="clr-namespace:ComplexControl;assembly:ComplexControl">
        <StackLayout HorizontalOptions="FillAndExpand" VerticalOptions="FillAndExpand">
            <Label Text="Welcome to Xamarin Forms!"/>
            <custom:ComplexControl.ComplexControl/>
        </StackLayout>
    
    </ContentPage>
    

    背后的代码是

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using Xamarin.Forms;
    using ComplexControl;
    
    namespace CustomControlUsageExample
    {
        public partial class MainPage : ContentPage
        {
            public MainPage()
            {
                //This way does not work
                //Step 2
    
                InitializeComponent();
            }
        }
    }
    

    我已经尝试过调试,但是没有看到它将用户控件添加到内容中。

    有人能帮我看看我做错了吗? 如果我不使用XAML进行自定义控制,它就可以工作。

    我正在使用代码完成userControl的usercontrol工作;但它将由XAML内的项目引用。

    谢谢,

1 个答案:

答案 0 :(得分:1)

XP,你正在做的一切正确。

不幸的是,小错误(:而不是=)导致您使用XAML定义的控件来解决此问题。

xmlns:custom="clr-namespace:ComplexControl;assembly:ComplexControl"

应该是

xmlns:custom="clr-namespace:ComplexControl;assembly=ComplexControl"

custom XAML namespace的语法为clr-namespace:NAMESPACE;assembly=ASSEMBLY

我相信Xamarin.Forms应该更聪明地命名空间并在编辑器或构建期间警告你这些错误类型(Xamarin.Forms默认情况下不编译XAML但没有人阻止它运行简单的语法检查,对吧?)。

如果您愿意,可以file a bug to Xamarin(很容易!)