我试图通过引用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 { }
}
}
它适用于代码(即不使用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内的项目引用。
谢谢,
答案 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(很容易!)