web-dev-qa-db-fra.com

Redimensionner la fenêtre et le contenu WPF en fonction de la résolution de l'écran

J'ai une application WPF avec plusieurs contrôles sur chaque fenêtre, certains superposés, etc., ce dont j'ai besoin est un moyen d'obtenir que l'application se redimensionne automatiquement en fonction de la résolution de l'écran.

Des idées ?

19
Welsh King

Faites simplement une reliure comme ça:

<Window x:Class="YourApplication.MainWindow"
    xmlns="http://schemas.Microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.Microsoft.com/winfx/2006/xaml"
    Title="YourApplication" 
    Height="{Binding SystemParameters.PrimaryScreenHeight}" 
    Width="{Binding SystemParameters.PrimaryScreenWidth}">
26
Fischermaen

La syntaxe Height = "{Binding SystemParameters.PrimaryScreenHeight}" fournit l'indice mais ne fonctionne pas comme tel. SystemParameters.PrimaryScreenHeight est statique, vous devez donc utiliser:

  <Window x:Class="MyApp.MainWindow"
      xmlns="http://schemas.Microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.Microsoft.com/winfx/2006/xaml"
      xmlns:tools="clr-namespace:MyApp.Tools"
      Height="{x:Static SystemParameters.PrimaryScreenHeight}" 
      Width="{x:Static SystemParameters.PrimaryScreenWidth}" 
      Title="{Binding Path=DisplayName}"
      WindowStartupLocation="CenterScreen"
      Icon="icon.ico"
  >

Et cela conviendrait à tout l'écran. Pourtant, vous pouvez préférer adapter un pourcentage de la taille de l'écran, par exemple 90%, auquel cas la syntaxe doit être modifiée avec un convertisseur dans une spécification de liaison:

  <Window x:Class="MyApp.MainWindow"
      xmlns="http://schemas.Microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.Microsoft.com/winfx/2006/xaml"
      xmlns:tools="clr-namespace:MyApp.Tools"
      Height="{Binding Source={x:Static SystemParameters.PrimaryScreenHeight}, Converter={tools:RatioConverter}, ConverterParameter='0.9' }" 
      Width="{Binding Source={x:Static SystemParameters.PrimaryScreenWidth}, Converter={tools:RatioConverter}, ConverterParameter='0.9' }" 
      Title="{Binding Path=DisplayName}"
      WindowStartupLocation="CenterScreen"
      Icon="icon.ico"
  >

Où RatioConverter est ici déclaré dans l'espace de noms MyApp.Tools comme suit:

namespace MyApp.Tools {

    [ValueConversion(typeof(string), typeof(string))]
    public class RatioConverter : MarkupExtension, IValueConverter
    {
      private static RatioConverter _instance;

      public RatioConverter() { }

      public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
      { // do not let the culture default to local to prevent variable outcome re decimal syntax
        double size = System.Convert.ToDouble(value) * System.Convert.ToDouble(parameter,CultureInfo.InvariantCulture);
        return size.ToString( "G0", CultureInfo.InvariantCulture );
      }

      public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
      { // read only converter...
        throw new NotImplementedException();
      }

      public override object ProvideValue(IServiceProvider serviceProvider)
      {
        return _instance ?? (_instance = new RatioConverter());
      }

    }
}

Où la définition du convertisseur doit hériter de MarkupExtension afin d'être utilisée directement dans l'élément racine sans une ancienne déclaration comme ressource.

71
berhauz