条件编译似乎在Xamarin Studio中不起作用

Kou*_*kar 3 conditional-compilation xamarin.ios xamarin xamarin.forms

我创建了一个Xamarin Forms应用程序。并在带有名为“ MyLabel”的标签的新页面内。在我的页面后面的代码中

private void SetUpUI()
{
    #if __IOS__
    this.MyLabel.BackgroundColor = Color.Navy;
    #endif
}
Run Code Online (Sandbox Code Playgroud)

在我的iOS项目选项中,我可以__IOS__在“编译器”选项卡中看到符号。(请看截图)

在此处输入图片说明

当我在iOS中运行时,它不会使标签变成蓝色:

但是,如果我删除#if __IOS__块,它将使标签变为蓝色:

因此,似乎条件编译不起作用。我在Mac上。因此无法在Visual Studio上进行测试。卡住了很长时间,但无法弄清我错过了什么。

Tim*_*ers 5

SushiHangover的答案是正确的:您的PCL项目将没有平台的编译器定义。

但是,自Xamarin Forms 2.3.4发布以来,他提供的解决方案已过时。Device.OnPlatform已按照本讨论中的讨论进行了重新设计,并在此Pull Request中实现

在Xamarin Forms 2.3.4及更高版本中执行此操作的正确方法是使用Device.RuntimePlatform。使用开关或条件开关来满足您的需求,如下所示:

if(Device.RuntimePlatform == Device.iOS)
{
    // iOS
}
else if(Device.RuntimePlatform == Device.Android)
{
    // Android
}
Run Code Online (Sandbox Code Playgroud)

如果要使用共享项目而不是PCL ,则可以按照您的要求进行操作。因为当您使用共享项目时,您可以访问平台项目的编译器指令。


Sus*_*ver 2

您在PCL 项目中使用的条件不包含这些编译器定义,因此您的条件代码显示为灰色

在您的 PCL 项目中,您可以使用Device.OnPlatform执行基于平台的处理:

Device.OnPlatform (iOS: () => this.MyLabel.BackgroundColor = Color.Navy; );
Run Code Online (Sandbox Code Playgroud)

回复:https ://developer.xamarin.com/api/member/Xamarin.Forms.Device.OnPlatform/