3

Für UWP brauche ich eine andere Größe für die Breite einer Spalte in einem Grid. Außerdem sollte der Wert auf dem Tablet und auf dem Smartphone unterschiedlich sein.Kann OnIdiom und OnPlatform in XAML (Xamarin.Forms) gemischt werden?

Der folgende Code stürzt die App

<ColumnDefinition> 
    <ColumnDefinition.Width> 
     <OnIdiom.Phone> 
      <OnPlatform x:TypeArguments="GridLength" iOS="*" Android="*" WinPhone="100" /> 
     </OnIdiom.Phone> 
     <OnIdiom.Tablet> 
      <OnPlatform x:TypeArguments="GridLength" iOS="*" Android="*" WinPhone="200" /> 
     </OnIdiom.Tablet> 
    </ColumnDefinition.Width> 
</ColumnDefinition> 

mit

Typ OnIdiom.Phone nicht http://xamarin.com/schemas/2014/forms

Der Code in Xmlns gefunden ist in einer ViewCell. Also kann ich keine zusätzliche ResourceDictionary verwenden und auch OnSizeAllocated() ist nicht im Code hinter der Datei verfügbar.

Ist es möglich, OnIdiom und OnPlatform zusammen zu verwenden?

Antwort

9

OnIdiom, wie OnPlatform ist ein Objekt, das Sie zu erklären haben. In Ihrem Fall setzen Sie die Eigenschaft OnIdiom.Phone auf ein Objekt, das nicht über diese Eigenschaften verfügt.

XAML sollte wie folgt aussehen:

<ColumnDefinition> 
    <ColumnDefinition.Width> 
    <OnIdiom x:TypeArguments="GridLength"> 
     <OnIdiom.Phone> 
     <OnPlatform x:TypeArguments="GridLength" iOS="*" Android="*" WinPhone="100" /> 
     </OnIdiom.Phone> 
     <OnIdiom.Tablet> 
     <OnPlatform x:TypeArguments="GridLength" iOS="*" Android="*" WinPhone="200" /> 
     </OnIdiom.Tablet> 
    </OnIdiom> 
    </ColumnDefinition.Width> 
</ColumnDefinition> 
+0

Ich habe versucht, die App auf dem lokalen Rechner auszuführen. Hier wird die 200er Breite nicht eingehalten. Sollte es nicht in die Kategorie "Tablet" fallen? – testing

+0

'Device.OS' ist' Windows' und 'Device.Idiom' ist' Desktop'. Gibt es dafür Definitionen im XAML? 'WinPhone' hat vorher gut funktioniert. – testing

+1

Unterstützung für 'Desktop' in OnIdiom vor ein paar Tagen gelandet https://github.com/xamarin/Xamarin.Forms/pull/420. Das Update wird in der kommenden 2.3.4-pre1 vorhanden sein –

0

Eine Möglichkeit, die in Code funktioniert, ist

if(Device.OS == TargetPlatform.Windows && Device.Idiom == TargetIdiom.Phone) 
    this.innerGrid.ColumnDefinitions.First().Width = new GridLength(100); 

zu verwenden, um die bestehende XAML-Definition zu überschreiben. innerGrid ist der Name des Grid, der im Xaml verwendet wird.

1

Xamarin.Forms XAML Beispiel:

<OnPlatform x:TypeArguments="View"> 
    <OnPlatform.Android> 
     <Grid> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition> 
        <ColumnDefinition.Width> 
         <OnIdiom x:TypeArguments="GridLength" Tablet="100" Phone="50" /> 
        </ColumnDefinition.Width> 
       </ColumnDefinition> 
       <ColumnDefinition> 
        <ColumnDefinition.Width> 
         <OnIdiom x:TypeArguments="GridLength" Tablet="100" Phone="50" /> 
        </ColumnDefinition.Width> 
       </ColumnDefinition> 
      </Grid.ColumnDefinitions> 
     </Grid> 
    </OnPlatform.Android> 
    <OnPlatform.iOS> 
     <Grid> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition> 
        <ColumnDefinition.Width> 
         <OnIdiom x:TypeArguments="GridLength" Tablet="100" Phone="50" /> 
        </ColumnDefinition.Width> 
       </ColumnDefinition> 
       <ColumnDefinition> 
        <ColumnDefinition.Width> 
         <OnIdiom x:TypeArguments="GridLength" Tablet="100" Phone="50" /> 
        </ColumnDefinition.Width> 
       </ColumnDefinition> 
      </Grid.ColumnDefinitions> 
     </Grid> 
    </OnPlatform.iOS> 
</OnPlatform> 
+0

OK, ich die komplette 'Grid' Definition multiplizieren. Aber ich habe ein paar Namen namens "Label" und man kann nicht mehrere Labels mit demselben Namen haben. Irgendeine Lösung dafür? – testing

Verwandte Themen