我在Xaml中有按钮,我已经提到了在click事件中调用的方法,如下所示。
<Button BorderRadius="1" BackgroundColor="#FFCA00" Text="Sign In" TextColor="Black" Clicked="login_clicked" HorizontalOptions="FillAndExpand" HeightRequest="44" WidthRequest="220" FontSize="19">
后端C#中的方法为
public void login_clicked(object sender, EventArgs e)
{
try
{
ValidateUser();
}
catch (Exception ex){}
}
问题是当我在链接选项中使用Sdk Assemblies
时这很有效,但是当我使用Sdk and User Assemblies
时,这个方法会被剥离,我在运行时遇到一个异常,说没有事件login_clicked
找到。
我知道这是因为链接器,但我不知道背后的原因。链接器是否解析Xaml以检查是否使用了此方法(我的意思是说这是方法是否必要且不应该被删除)。
当我从C#注册事件时,链接器不会删除login_clicked方法。
btnLogin.Clicked += login_clicked;
答案 0 :(得分:1)
XAML
未被解析为编译时,它基本上是一个资源字符串。
两个选项:
1)使用[Preserve]属性标记方法,以便链接器不会将其删除。
[Preserve]
参考:Cross platform Linking 参考:iOS Linker 参考:Android Linker
2)将XAML预编译到IL中,以便链接器知道正在使用该事件。
[assembly: XamlCompilation (XamlCompilationOptions.Compile)]
这有一个额外的好处,就是编译时检查你的XAML,一些XAML加载和实例化时间的减少,以及轻微的内存减少。
参考:Using the XAML compiler to increase the performance of a Xamarin.Forms app