2

J'ai créé une application Xamarin Forms. Et à l'intérieur d'une nouvelle page avec une étiquette nommée "MyLabel". Dans le code derrière pour ma page J'ai La compilation conditionnelle ne semble pas fonctionner dans Xamarin Studio

private void SetUpUI() 
{ 
    #if __IOS__ 
    this.MyLabel.BackgroundColor = Color.Navy; 
    #endif 
} 

Dans mes options de projet iOS Je peux voir le symbole __IOS__ dans l'onglet « compilateur ». (S'il vous plaît voir capture d'écran)

enter image description here

Quand je lance dans iOS il ne fait pas l'étiquette bleue:

Mais si je retire #if __IOS__ bloc, il fait l'étiquette bleue:

il semble donc compilation conditionnelle ne fonctionne pas. Je suis sur un Mac. Donc, ne pouvait pas tester sur Visual Studio. Collé avec elle pendant une longue période, mais ne peut pas comprendre ce que j'ai manqué.

Répondre

2

Vous utilisez les dans votre conditionals projet PCL qui ne contiendrait pas les compilateur définit, donc pourquoi votre code conditionnel est grisées out.

Dans votre projet PCL, vous pouvez utiliser Device.OnPlatform pour effectuer un traitement à base de plate-forme:

Device.OnPlatform (iOS:() => this.MyLabel.BackgroundColor = Color.Navy;); 

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

+0

C'est le chemin à parcourir si vous utilisez les versions de Xamarin Forms ** avant ** v2.3.4. Sinon, utilisez 'Device.RuntimePlatform' comme indiqué dans ma réponse. –

2

La réponse de SushiHangover est correcte: votre projet PCL n'aura pas le compilateur définitions pour les plates-formes. Toutefois, la solution qu'il fournit est devenue obsolète depuis la sortie de Xamarin Forms 2.3.4. Device.OnPlatform a été repensé comme discuté dans this discussion et implémenté dans this Pull Request.

La méthode correcte pour cela dans Xamarin Forms 2.3.4 et versions ultérieures consiste à utiliser Device.RuntimePlatform. Utilisez un commutateur ou conditionnel en fonction de vos besoins comme ceci:

if(Device.RuntimePlatform == Device.iOS) 
{ 
    // iOS 
} 
else if(Device.RuntimePlatform == Device.Android) 
{ 
    // Android 
} 

Il serait possible de le faire comme vous avez demandé, si vous deviez utiliser un projet partagé au lieu d'un PCL. Parce que lorsque vous utilisez un projet partagé, vous avez accès aux directives du compilateur de vos projets de plate-forme.