2010-03-18 7 views

risposta

1

Si potrebbe utilizzare un convertitore per calcolare l'altezza in base all'altezza della finestra, qualcosa di simile ...

È necessario passare la Window.ActualHeight nel convertitore - sarà poi tornare l'altezza della finestra, moltiplicato per 0.75. Se, per qualsiasi ragione, quando viene colpito il convertitore, Window.ActualHeight è nullo (o hai accidentalmente passato qualcosa che non può essere lanciato su un doppio) restituirà double.NaN, che imposterà l'altezza a Auto.

public class ControlHeightConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, 
          System.Globalization.CultureInfo culture) 
    { 
     double height = value as double; 

     if(value != null) 
     { 
      return value * 0.75; 
     } 
     else 
     { 
      return double.NaN; 
     } 
    } 
} 

Bind questo per il vostro controllo in questo modo ... (ovviamente questa è una versione molto cut-down del XAML!)

<Window x:Name="MyWindow" 
    xmlns:converters="clr-namespace:NamespaceWhereConvertersAreHeld"> 
    <Window.Resources> 
    <ResourceDictionary> 
     <converters:ControlHeightConverter x:Key="ControlHeightConverter"/> 
    </ResourceDictionary> 
    </Window.Resources> 

    <ListView MaxHeight="{Binding 
     ElementName=MyWindow, Path=ActualHeight, 
     Converter={StaticResource ControlHeightConverter}}"/> 
</Window>  
+0

Ho provato questo approccio, e funziona bene, ma quando ridimensiono la finestra, il convertitore non viene colpito, quindi il MaxHeight non cambia di conseguenza. Qualche idea su come sistemarlo? – Muis

3

Un altro approccio (senza convertitore) sarebbe semplicemente posto in una griglia di dimensioni stellari. Certamente, questo mette alcune restrizioni sul tuo layout. Quindi, dipende dal contenuto dell'altro se questo approccio può essere usato o meno.

<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="0.75*"/> 
     <RowDefinition Height="0.25*"/> 
    </Grid.RowDefinitions> 

    <ListView Grid.Row="0" VerticalAlignment="Top"/> 
    <!-- some other content --> 

</Grid> 

Dal momento che si voleva essere indicate le MaxHeight del ListView, ho impostato il VerticalAlignment-Top, in modo che non utilizza tutto lo spazio disponibile, se non è necessario. Naturalmente, è possibile impostare anche questo su Bottom o Stretch, in base alle proprie esigenze.

Problemi correlati