2016-06-16 36 views
14

Non riesco a calcolare la sintassi XAML per applicare i vincoli a RelativeLayout utilizzando uno Style.In Xamarin XAML, come posso impostare un vincolo su un RelativeLayout usando uno stile?

Il primo elemento di Xamarin XAML di seguito mostra una coppia di elementi nidificati di RelativeLayout utilizzati per costruire un layout semplice (l'elemento interno pone semplicemente un margine attorno a un'area a cui è possibile aggiungere altro contenuto). Questa versione del codice si basa e funziona bene su iOS e Android.

<?xml version="1.0" encoding="utf-8" ?> 
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" 
      xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
      x:Class="App2.Page1"> 
    <RelativeLayout BackgroundColor="Gray"> 
     <RelativeLayout BackgroundColor="Maroon" 
      RelativeLayout.HeightConstraint="{ConstraintExpression Type=RelativeToParent,Property=Height,Factor=0.9,Constant=0}" 
      RelativeLayout.WidthConstraint="{ConstraintExpression Type=RelativeToParent,Property=Width,Factor=0.9,Constant=0}" 
      RelativeLayout.YConstraint="{ConstraintExpression Type=RelativeToParent,Property=Height,Factor=0.05,Constant=0}" 
      RelativeLayout.XConstraint="{ConstraintExpression Type=RelativeToParent,Property=Width,Factor=0.05,Constant=0}"> 
      <BoxView Color="Yellow" 
       RelativeLayout.HeightConstraint="{ConstraintExpression Type=RelativeToParent,Property=Height,Factor=0.25,Constant=0}" 
       RelativeLayout.WidthConstraint="{ConstraintExpression Type=RelativeToParent,Property=Width,Factor=0.25,Constant=0}" 
       RelativeLayout.YConstraint="{ConstraintExpression Type=RelativeToParent,Property=Height,Factor=0.25,Constant=0}" 
       RelativeLayout.XConstraint="{ConstraintExpression Type=RelativeToParent,Property=Width,Factor=0.25,Constant=0}"/> 
     </RelativeLayout> 
    </RelativeLayout> 
</ContentPage> 

Quello che vorrei fare è utilizzare lo stesso layout su più pagine, così voglio mettere le RelativeLayout vincoli in un Style. Questo secondo pezzo di codice non viene analizzato o eseguito, ma spero che mostri ciò che sto cercando di ottenere. Se riesco a ottenere la sintassi corretta per questo, l'idea è che il Style possa essere spostato in un file condiviso, così posso facilmente riutilizzarlo su più istanze di ContentPage.

<?xml version="1.0" encoding="utf-8" ?> 
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" 
      xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
      x:Class="App2.Page2"> 
    <ContentPage.Resources> 
     <ResourceDictionary> 
      <Style x:Key="LayoutStyle" TargetType="RelativeLayout"> 
       <Setter Property="BackgroundColor" Value="Maroon"/> 
       <Setter Property="HeightConstraint"> 
        <Setter.Value>"Type=RelativeToParent,Property=Height,Factor=0.9,Constant=0"</Setter.Value> 
       </Setter> 
       <Setter Property="WidthConstraint"> 
        <Setter.Value>"Type=RelativeToParent,Property=Width,Factor=0.9,Constant=0"</Setter.Value> 
       </Setter> 
       <Setter Property="YConstraint"> 
        <Setter.Value>"Type=RelativeToParent,Property=Height,Factor=0.05,Constant=0</Setter.Value> 
       </Setter> 
       <Setter Property="XConstraint"> 
        <Setter.Value>"Type=RelativeToParent,Property=Width,Factor=0.05,Constant=0</Setter.Value> 
       </Setter> 
      </Style> 
     </ResourceDictionary> 
    </ContentPage.Resources> 
    <RelativeLayout BackgroundColor="Gray"> 
     <RelativeLayout Style="LayoutStyle"> 
      <BoxView Color="Yellow" 
       RelativeLayout.HeightConstraint="{ConstraintExpression Type=RelativeToParent,Property=Height,Factor=0.25,Constant=0}" 
       RelativeLayout.WidthConstraint="{ConstraintExpression Type=RelativeToParent,Property=Width,Factor=0.25,Constant=0}" 
       RelativeLayout.YConstraint="{ConstraintExpression Type=RelativeToParent,Property=Height,Factor=0.25,Constant=0}" 
       RelativeLayout.XConstraint="{ConstraintExpression Type=RelativeToParent,Property=Width,Factor=0.25,Constant=0}"/> 
     </RelativeLayout> 
    </RelativeLayout> 
</ContentPage> 

Per favore qualcuno può aiutarmi con la sintassi per fare questo?

Questo è un link ad un esempio completo (che, ovviamente, richiede Xamarin da installare e ha bisogno i pacchetti Nuget da ristrutturare): XAML Layout Example

risposta

7

Prova questo:

<ResourceDictionary> 
    <Style x:Key="LayoutStyle" TargetType="RelativeLayout"> 
     <Setter Property="BackgroundColor" Value="Maroon"/> 
     <Setter Property="RelativeLayout.HeightConstraint" Value="{ConstraintExpression RelativeToParent,Property=Height,Factor=0.9,Constant=0}"/> 
     <Setter Property="RelativeLayout.WidthConstraint" Value="{ConstraintExpression RelativeToParent,Property=Width,Factor=0.9,Constant=0}"/> 
     <Setter Property="RelativeLayout.YConstraint" Value="{ConstraintExpression RelativeToParent,Property=Height,Factor=0.05,Constant=0}"/> 
     <Setter Property="RelativeLayout.XConstraint" Value="{ConstraintExpression RelativeToParent,Property=Width,Factor=0.05,Constant=0}"/> 
    </Style> 
</ResourceDictionary> 
+0

Grazie. Questo effettivamente costruisce e funziona; tuttavia, penso che ci possa essere un bug nel modello di layout Xamarin perché ottengo un comportamento inconsistente quando sposto il vincolo in uno stile. Non è come i CSS, è così, in cui spostare la regola in uno stile diminuisce il suo punteggio nell'algoritmo che decide cosa applicare? Ho intenzione di sollevarlo come un bug con Xamarin. – Patrick

+0

È possibile sovrascrivere le proprietà impostate in uno stile fornendo una diversa impostazione in linea sull'elemento, ma le regole sono molto più semplici di quelle con i CSS. Tuttavia Xamarin.Forms è abbastanza sensibile a non specificare abbastanza informazioni per il layout, che si manifesta come comportamento incoerente. Poiché questa risposta affronta la domanda originale, contrassegnala come risposta accettata. Per capire cosa sta succedendo con il layout, oltre a presentare un bug con Xamarin, puoi anche fare un'altra domanda con screenshot delle due versioni della tua pagina. – DavidS

+0

Il mio errore. Potrei calciarmi. Quando provo ad applicare lo stile come mostrato sopra, ho dimenticato di inserire "{StaticResource ...}" nello specificatore. Quindi, per essere chiari al 100%, la risposta di @DavidS è completamente corretta e funziona perfettamente. Grazie ancora. – Patrick